2009-04-14 12 views
2

私のプログラミング言語クラスの型等価については、私は確信しているCの状況に出くわしました。型の等価性にint配列のサイズの影響

としては、Cの「タイプ等価」を説明:C名前と構造同値の間に入る型等価の形態を使用し、緩く構造的構造体と共用体の名前等価」として記述することができる

他のすべてのものと同等です。 "私が必要とするすべてが構造同値であるので

typedef int A1[10]; 
typedef int A2[20]; 

、これら二つは構造的に同等と考えられる:私は、異なるサイズの2つの配列を持っていますが、同じベース型のであれば何

? Cでは、配列型の一部であるインデックスセットのサイズは、配列型かどうかですか?

答えて

3

いいえ、そうではありません。

sizeof(A1)sizeof(A2)を試してみてください。

2

いいえ、同じ種類ではありません。

Cでは、エラーを取得することはできませんが、あなたがしようとした場合C++であなたはエラー何かのようになります:

エラーC2440:「初期化すると、」:「int型()から変換することはできませんが、[ INT()「から '1024] [ここで512]'

は、いくつかのサンプルコード

int x[1024]; 
int y[512]; 
/*Create a pointer int[1024] type*/ 
int (*px)[1024] = &x; 
/*Create a pointer int[512] type*/ 
int (*py)[512] = &y; 

int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/ 

があっても最後の行がCで許可されることが知られています、 2つのタイプが異なるとみなされます。また、配列は配列へのポインタと同じではありませんが、あなたが見ることができるように、型宣言は異なります。

+0

しかし私の本では、ポインタはCで構造的に等価であると言っています。したがって、配列がn個の要素へのポインタであれば、それらは構造的に等価ではないでしょうか? – Mithrax

+0

配列はポインタではありません - 状況によってはポインタに分解される可能性がありますが、ポインタと同じではありません –

+1

メダルが多すぎます:-) –

0

いくつかのコンテキストでは、さまざまな型の変数が特定の式で互換性があり、コンパイラは、予想されることを実行するのに十分な魔法を呼び出すでしょう。ポインタ。 しかし、それはそれらのメモリレイアウトが互換性があることを意味しません。私がそれを逃した質問 Pointer vs array in C, non-trivial differenceを参照してください。

あなたの本は「構造的均衡」によって何を意味しているのかよく分かりませんが、それはおそらくデフォルトの整数昇格を指しているのだろうかと思います。しかし、どのような場合でも、整数宣伝は非常に重要な問題であり、理解に時間を費やすべきです。以下のprintfは、それらのルールに基づいて実行されなければならない:

unsigned int i = 0; 
if (i < -1) { 
     printf("This line is printed!\n"); 
} 

C standard (ISO/IEC 9899:1990)は動作を定義タイトル「通常の算術変換」のセクションを含んでいます。標準は自由に利用することはできません(反対に、ISO標準はページごとに価格設定されているので、どちらかといえば高価です)。しかし、その用語を検索すると、有益な情報や引用を見つけることができます。標準のドラフトのいくつかは自由に利用できますが、最終的な標準に変更されたものが正確にわからないため、大量の不信を持つ人を脅かすものです。

+0

本当ですか?私はそれに問題はありませんが、いずれにしてもタイトルを検索できるはずです。 – hlovdal

関連する問題