質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

2430閲覧

C言語 int型配列のアドレスを関数に渡した時の配列サイズが変わる??

fukupiyo

総合スコア27

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2017/08/19 09:09

###前提・実現したいこと
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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

要素数については自己解決しました。

printf ("int *:size = %d\n", sizeof(int *)); // ("int *:size = 8")

int型ポインタの変数のサイズが自環境では8でした。
閲覧頂いた皆様、勉強不足によりご面倒をおかけしました。

→ では配列を渡したときにサイズはどうやって取得するのか??という新たな疑問は出てきますが
また調べてみて新たに質問をあげさせていただきます。

投稿2017/08/19 09:34

fukupiyo

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/08/19 09:38

> では配列を渡したときにサイズはどうやって取得するのか?? は、不可能なので、要素数も引数で別途渡します。
fukupiyo

2017/08/19 09:42

otn様 コメントありがとうございます。 やっぱり要素数も一緒に渡してあげるのですね。 intexec3(int *ar, int size) としたら、内容がきちんと出てきました。 とてもうれしいコメント、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問