C言語の動的配列よく分からないんだが教えてくれ

公開日: : 最終更新日:2015/05/16 C, プログラミング , , , ,

1: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:11:38.295 ID:7VFoSvm60.net
普通の配列で例えばint a[10];
を宣言して

printf(“%p”,a);
ってやるとアドレスが出るじゃん?
つまり配列名だけ指定するとポインタを宣言したのと同じなのかと
思ったんだけど違うの?

例えば

int *i;

って宣言して
i[0] = 5;
とかやろうとすると強制終了しちゃう

2: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:12:21.799 ID:SWmNGTAra.net
&

 

3: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:13:42.580 ID:yueSHt000.net
後者はアドレスの先が確保されてないから落ちる

 

4: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:14:44.874 ID:uha4Wmjb0.net
実体がないから

 

5: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:16:04.705 ID:7VFoSvm60.net
実体って何…うぉ…

 

10: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:20:06.842 ID:yueSHt000.net
>>5
やるなら
i=(int*)malloc(sizeof(int)*10);
とかやってメモリ確保しろ

 

14: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:23:44.314 ID:7VFoSvm60.net
>>10
キャスト変換する意味って何?
mallocが返すポインタ変数は何のポインタ型にでも入れられるって
習ったんだけど、明示的に書く理由って視認性とかそういう理由?

 

17: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:25:13.972 ID:yueSHt000.net
>>14
確かに書かなくても動くんだけど、C言語書くなら常に型気にしとかないとな

 

9: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:18:48.770 ID:7VFoSvm60.net
int *i;
i = malloc(sizeof(int) * 10);

ってやると普通の配列みたいに使える理由は
2行目でその実態ってのを確保してるからなの?

 

13: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:23:04.752 ID:yueSHt000.net
>>9
メモリ確保してるから
確保したら解放しろよ

あと、配列はスタック領域、メモリ確保した場合はヒープ領域ってメモリでも別の場所のメモリをつかうんだよ

 

11: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:20:26.932 ID:gUjWxZ2vp.net
まあCでは配列もポインタも似たような使い方ができる

 

12: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:22:49.175 ID:PJhpjVGa0.net
int a[10];  → int型を入れる領域を10個用意、aはその先頭アドレス
int *i;   → int型の”アドレス”を入れる領域を用意

 

16: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:25:08.810 ID:T7TPjXCQ0.net
要するに下はアドレスを指すための変数は用意しているけど
指されるアドレスそのものがないんだから代入しても「どこに代入するんだよ」ってなる

 

19: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:28:08.602 ID:7VFoSvm60.net
>>12
それは理解してるつもりなんだけど
何か理解不足なのかなぁ…

>>13
別の領域を使う!?初耳だ

>>16
んーなんかしっくりこないんだよなぁ

i[0]ってやればいけると思ったのになー

 

22: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:31:39.223 ID:yueSHt000.net
>>19
組み込みシステム用に作るときはスタック領域が少ないから、あまり配列とか使わないように気を付けなきゃいけない場合がある
パソコン上で動かすときはスタック領域もバカデカいからあまり気にしなくても動くけどね

 

25: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:33:16.193 ID:7VFoSvm60.net
>>22
へー勉強になります
ハードとかも勉強しないといけないかな

あ、でも配列も宣言した以上の要素を指定すると
おかしくなるし、その確保ってのがキモなのか

 

18: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:26:39.649 ID:PJhpjVGa0.net
mallocするとiが配列のように使えるのは、
mallocの戻り値であるint型を10個入れる領域のアドレスがiに代入されるから

キャストするのは明示&コンパイラやオプションによってはワーニングが出るからそれの回避

 

21: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:30:56.405 ID:7VFoSvm60.net
>>18
>mallocの戻り値であるint型を10個入れる領域のアドレスがiに代入されるから
int型10個分の領域の一番初めのアドレスが入るでしょ?

だったら
int *i;
i[0] = 5;
ってやってもアドレスを指定してあげてる事には変わりないかなーと
思ったんだけど、”確保”しておくというのが大事なのかな

 

27: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:34:09.824 ID:JpRfnPkC0.net
>>21
アドレスにはアドレスしか入んないのになんで5(整数)入れようとしてんの?

 

26: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:33:35.642 ID:T7TPjXCQ0.net
ちなみに知ってると思うけど
array[i]は*(array+i)を人間にわかりやすく書いただけなんだぜ
こう書くと配列とポインタが似ているものだとわかるだろう
ただ配列は宣言の段階でどのくらいの領域を確保するかを指定するので>>1みたいな間違えは起こりにくい

 

51: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:57:43.153 ID:T7TPjXCQ0.net
俺が>>26に書いたけど
i[0]っていうのは*(i+0)、つまり*i(=ポインタiの中身)と結局同じなんだ
ポインタiの中身に5を代入してって命令してるけどポインタiが何を示すかわからないから…以降同じ
これで多分説明やめるわ

 

54: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:02:13.726 ID:7VFoSvm60.net
>>51
うん その入ってる物が”不定値”だからダメって事なんだよね
不定値は使えないっていう理解が無かったからすごく勉強になった

 

56: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:05:39.483 ID:PJhpjVGa0.net
>>54
突っ込んでおくけど
ここで扱っているメモリと、ファイルとかが保存されている領域(HDD)は全くの別物だぞ

 

58: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:08:26.901 ID:7VFoSvm60.net
>>56
あ、いや書きかけのwordとかってメインメモリにあると思ってたけど
そういうのもHDDにある・・・??

でもはい、すいません大丈夫です!

スポンサーリンク

37: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:44:54.369 ID:Y3arrU8Cp.net
たまたまiが書き込み可能な領域を指してたら落ちずに動作する?

 

41: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 21:47:52.631 ID:bhQl8Oio0.net
>>37
落ちないかもしれないけど正常に動作するとは限らない

 

53: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:01:40.445 ID:gUjWxZ2vp.net
昔組込のドライバ設計してた時、配列でミスってスタック破壊して落ちたの思い出した

 

57: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:06:26.223 ID:yueSHt000.net
>>53
俺も新人の頃に組み込みシステム開発してて、ファイル検索を再起呼び出しで設計して痛い目見たことあるなw
負荷テストやってはじめて気づくバグ

 

60: 以下、\(^o^)/でVIPがお送りします 2015/05/09(土) 22:10:27.493 ID:OGFcpyut0.net
簡単に言うと

メモリはOSによって管理されていて使って良い領域と使ってはいけない領域がある
使ってはいけない領域にアクセスすると例外が発生してプログラムが停止する

だから,ポインタ変数に不定な値が入った状態でメモリにアクセスすると,
ほとんどの場合は使っちゃいけない領域にアクセスしてちゃってプログラムが停止する
(運よく使ってもいい領域にアクセスできることもあるけどバグの原因になる)

だから,mallocでOSにメモリを分けてもらって初めて
その確保した領域を使えるようになる
引用元URL:http://viper.2ch.sc/test/read.cgi/news4vip/1431173498/

関連記事

https---www.pakutaso.com-assets_c-2014-08-MIMIYAKO85_cafedesigoto20140725500-thumb-autox1000-5163

Swift(プログラミング言語)の需要はあるのか ニートだけど、この言語でお仕事したい

1: 番組の途中ですがアフィサイトへの\(^o^)/です 2015/05/18(月) 17:16:

記事を読む

スクリーンショット 2014-06-07 4.26.54

【IT】松江発、プログラミング言語「Ruby」普及を目指しサイト開設

1: キャプテンシステムρφ ★@転載は禁止 2014/06/05(木) 11:16:49.15

記事を読む

bsMJ_chisuima-jan15144715

プログラミング11日目だけどゲーム性を詰める事が急務だと気付いた

1: 以下、\(^o^)/でVIPがお送りします 2015/10/04(日) 12:04:45.7

記事を読む

スクリーンショット 2014-05-12 13.36.30

Javaってどうしてすぐ死んでしまうん?ww

1: 名無しさん@お腹いっぱい。 04/03/26 21:55 ID:vqYooqHy.net

記事を読む

part7_img

【驚愕】天才プログラミングだけど質問ある?

1: 以下、\(^o^)/でVIPがお送りします 2015/06/26(金) 07:29:12.7

記事を読む

スクリーンショット 2014-05-12 13.55.03

Java初心者でなのだが・・

1: 1 04/03/26 23:06 ID:0crt3aOz.net 初心者なので分かる方宜し

記事を読む

Remodeled_meiji_jingu_stadium

神宮球場ってMySQLの持ち込みできる?

1: 風吹けば名無し@\(^o^)/ 2015/07/12(日) 11:11:48.70 ID:t

記事を読む

43229ad807120631f052743290374151_s

全てが機械化されて働かないで良い世界が来たら問題ってなんかある?

1: 以下、\(^o^)/でVIPがお送りします 2015/06/13(土) 23:13:53.4

記事を読む

sTDvRR7

電子工作をはじめてみた

1: 以下、\(^o^)/でVIPがお送りします 2015/10/24(土) 18:50:39.8

記事を読む

dt-mthread01_01

マルチスレッドのバリアが役立つケースってどんなの?

1: 以下、\(^o^)/でVIPがお送りします 2015/08/15(土) 07:39:42.7

記事を読む

Huawei-Mate-8-benchmark-post-launch_1
Androidのベンチマーク、10万点を突破 インフレが止まらない

1: 番組の途中ですがアフィサイトへの\(^o^)/です (ニククエ

hGJvbfh
せっかくの休みだ。原付で>>5に行く。

1: 名無しさん@おーぷん 2015/11/29(日)06:13:2

9xHNnte
XperiaZ5からdocomoのロゴだけ消せるシートが発売開始

1: 番組の途中ですがアフィサイトへの\(^o^)/です (アウアウ

bsLISA78_MBAsawaru20141018102912
子供にプログラミング教えることになりそうなんだが、どうやって教えたら良いんだ?

1: 以下、\(^o^)/でVIPがお送りします 2015/11/2

top
国内で最大容量の8THDDが2万円台に値下がり

1: 海江田三郎 ★ 2015/11/29(日) 14:43:35.

→もっと見る

PAGE TOP ↑