###前提・実現したいこと
Cの勉強を始めたばかりです。
情報の過不足などありましたらお手数ですがご指摘ください。
int型の配列aを作成し、中身を表示するプログラムです。
intexec2() 内ではaの各要素は正しく表示されていますが、aのアドレスを intexec3() に渡して
中身を表示しようとすると要素数が10から2に減っています。(sizeof(a) = 40, sizeof(ar) = 8)
しかしながら、intexec3() のあとの処理でbにアドレスを渡して表示すると、結果が正しく表示されています。
メモリが破損しているわけではないと思われます。
intexec3()には参照アドレスはきちんと渡っているように見えるのですが、
配列のサイズ(=sizeof(ar))が変わってしまうのはなぜでしょうか?
ご教示いただければと思います。
###該当のソースコード
fuga.c
C
1#include <stdio.h> 2 3void intexec2(); 4void intexec3(int *ar); 5 6int main(void) { 7 intexec2(); 8 return 0; 9} 10 11void intexec2() { 12 int a[10] = {1,2,3,4,5,6,7,8,9,0}; 13 printf ("a = %08x\n", a); 14 15 printf ("a:size = %d\n", sizeof(a)); 16 printf ("a[0]:size = %d\n", sizeof(a[0])); 17 18 int const size = sizeof(a) / sizeof(a[0]); 19 for (int i = 0; i < size; i++) { 20 printf ("a[%d][%08x] = %d\n", i, &a[i], a[i]); 21 } 22 23 intexec3(a); 24 25 int *b; 26 b = a; 27 for (int i = 0; i < size; i++) { 28 printf ("b[%d][%08x] = %d\n", i, &b[i], b[i]); 29 } 30} 31 32void intexec3(int *ar) { 33 int const size = sizeof(ar) / sizeof(ar[0]); 34 35 printf ("ar:size = %d\n", sizeof(ar)); 36 printf ("ar[0]:size = %d\n", sizeof(ar[0])); 37 38 for (int i = 0; i < size; i++) { 39 40 printf ("ar[%d][%08x] = %d\n", i, &ar[i], ar[i]); 41 } 42 return; 43}
###実行結果
(一部改行を入れています。)
[hoge@host c]$ ./fuga a = 8847e790 a:size = 40 a[0]:size = 4 a[0][8847e790] = 1 a[1][8847e794] = 2 a[2][8847e798] = 3 a[3][8847e79c] = 4 a[4][8847e7a0] = 5 a[5][8847e7a4] = 6 a[6][8847e7a8] = 7 a[7][8847e7ac] = 8 a[8][8847e7b0] = 9 a[9][8847e7b4] = 0 ar:size = 8 ar[0]:size = 4 ar[0][8847e790] = 1 ar[1][8847e794] = 2 b[0][8847e790] = 1 b[1][8847e794] = 2 b[2][8847e798] = 3 b[3][8847e79c] = 4 b[4][8847e7a0] = 5 b[5][8847e7a4] = 6 b[6][8847e7a8] = 7 b[7][8847e7ac] = 8 b[8][8847e7b0] = 9 b[9][8847e7b4] = 0 [hoge@host c]$
###補足情報(言語/FW/ツール等のバージョンなど)
OS:
[hoge@host c]$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
C:
[hoge@host c]$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/19 09:38
2017/08/19 09:42