3

コードのテストについて

#include <stdio.h>

 int main()
 {
     char a[5][3];

     printf("a = %p\n", a);
     printf("&a[0] = %p\n", &a[0][0]);
     printf("&a = %p\n", &a);
     printf("*a = %p\n", *a);

     return 0;
  }

コンパイルされ、C モードで出力されます ( http://ideone.com/KD9Wz1 ):

a = 0xbfd8ea51
&a[0] = 0xbfd8ea51
&a = 0xbfd8ea51
*a = 0xbfd8ea51

厳密な C99 モード ( http://ideone.com/iTACGZ ) でコンパイルすると、コンパイル エラーが発生します。

prog.c: In function ‘main’:
prog.c:7:10: error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has     type ‘char (*)[3]’ [-Werror=format]
prog.c:9:10: error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has    type ‘char (*)[5][3]’ [-Werror=format]
cc1: all warnings being treated as errors

上記のコードは C99 で有効ではありませんか?

4

1 に答える 1

5

標準では、文字ポインターと void ポインターが同じ表現を持つことが保証されているため、void*を除くすべてのポインターに対して明示的なキャストを挿入する必要があります。char*

6.2.5.27: へのポインターvoidは、文字型へのポインターと同じ表現およびアライメント要件を持たなければなりません。

C89 プログラムにも同じ問題がありますが、コンパイラはそれをキャッチしません。

修正は次のとおりです。

printf("a = %p\n", (void*)a);
printf("&a[0] = %p\n", &a[0][0]);
printf("&a = %p\n", (void*)&a);
printf("*a = %p\n", *a);
于 2013-07-25T17:29:52.000 に答える