2015-11-18 10 views
12

gcc -Wall -pedantic -ansi -std=c89で次のコードをコンパイルすると、ポインタ割り当て時にエラーが発生することなく正常にコンパイルされました。 int (*)[4]からint (*)[]に変換することに注意してください。この(互換性がない?)の割り当てを可能にするためのいくつかの理由があると仮定すると不完全な配列タイプですか?

int arr[4]; 
int (*p_arr)[] = &arr; 

は、私はそれを使用しようとすると、コンパイラが不完全な型エラーerror: invalid application of ‘sizeof’ to incomplete type ‘int[]’を与えます。

(void) sizeof(*p_arr); 

このエラーは、以前のポインタ割り当てを許可する使用が何であるか考えています。p_arr = &arr?この割り当ては標準に従って許可されていますか?

私は不完全な構造体/共用体型(通常は前方宣言用)を使用していますが、エラーincomplete array element typeも発生しています。しかし、このincomplete array typeは私にとって初めてのものです。 Cの標準で可能であり、ユースケースを持っていますか?

+2

一つの言語を決定します。 CとC++は異なります。 – Lundin

+0

@ Lundinわかりました。私はいつもこれまで1つのタグを選んでいました。しかし、 'C 'と' C++'の違いについて質問している場合、どのタグを選択するのですか?これらのタグは絶対に排他的であるとか、検索用語にすぎないと思っていますか? – user1969104

+0

@ user1969104 CとC++の違いについて質問していますか?そうは思われません。もしあなたがそうだったら、両方のタグを追加するといいでしょう。私はLundinがこのコメントを追加していないと確信しています。 –

答えて

6

バインドが不明な配列は、互換性のある要素型の配列と互換性があるため、型の互換性があるため、この割り当てでエラーは発生しませんでした。For reference) -

int (*p_arr)[] = &arr; 

しかし*p_arrが不完全型であり、あなたがsizeofオペレータへのオペランドとして不完全な型を使用することになっていないので、sizeofオペレータへのオペランドとして渡すにエラーが発生します。

N1570 6.5.3.4

1 sizeof演算子は、このようなタイプの括弧名前、またはビットを指定する式に、関数型または不完全型を持つ式にを適用してはなりませんフィールドメンバー[...]。

今、あなたはそれを使用することができるものを、ここでは簡単な例です -

#include <stdio.h> 

int main(void){ 
    int arr[4]={1,2,3,4}; 
    int a[6]={1,2,3,3,1,1}; 
    int (*p_arr)[] = &arr; 
    for(int i=0;i<4;i++) 
     printf("%d",(*p_arr)[i]); 
    printf("\n"); 
    p_arr=&a; 
    for(int i=0;i<6;i++) 
     printf("%d",(*p_arr)[i]); 
    return 0; 
} 
+0

ありがとうございます。私はC++を含むように私の質問を更新しました。 – user1969104

+2

@ user1969104突然編集で質問を変更しないでください。新しい質問がある場合は、新しい質問を投稿してください。それが判明したように、2番目の質問は、CとC++の間のポインタ変換規則の違いに関連しています。これは不完全な型へのポインタにも関係しません。 CとC++の 'intptr = voidptr;'の例を考えてみましょう。 – Lundin

+0

@ Lundin私は新しい質問に編集を移動できます。 – user1969104

関連する問題