回答編集履歴
5
たぶんわかった
test
CHANGED
@@ -1,4 +1,24 @@
|
|
1
|
+
int n;に文字列を代入していることで、
|
2
|
+
|
3
|
+
4byteより大きいデータを入れようとしたとき、nが入っているメモリの直後の領域が
|
4
|
+
|
5
|
+
無理やり書きかえられる事になりそう。
|
6
|
+
|
7
|
+
文字は半角英数字でも一文字で1byteだからほとんどの場合でnが入っているメモリを飛び出すよね。
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
すると、nの入っているメモリの直後に、関数のアドレスとか、main関数のアドレスとかが入っていたら
|
12
|
+
|
13
|
+
そこが書き換えられて、関数の呼び出しに失敗して、止まってしまうんじゃないかな?
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
見る限り、n=rand()%100; とすれば、他には問題はなさそう...
|
18
|
+
|
19
|
+
|
20
|
+
|
1
|
-
プログラムの発想自体があまりよくないです。
|
21
|
+
あと、プログラムの発想自体があまりよくないです。
|
2
22
|
|
3
23
|
同じデータが何個も格納されているのは無駄です。
|
4
24
|
|
4
\.\.
test
CHANGED
@@ -1,48 +1,4 @@
|
|
1
|
-
char *list[100];と最初に宣言しているところで、char* 型を100個入れる配列を作っているのだと思ってるのでは?
|
2
|
-
|
3
|
-
おそらく質問者は list[n] が、ひとつのchar*型のデータで、
|
4
|
-
|
5
|
-
nの値ごとに違う文字列になるのだと思っているのだと思いますが、違います。
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
char *list[100];と宣言すると、100文字分までの文字列を入れるのに十分なメモリを確保し、その最初の文字が入っているアドレスを入れるポインタのアドレスを入れるポインタをlistと名づけます。
|
10
|
-
|
11
|
-
二回同じことを書いていますが、書き間違いではありません。
|
12
|
-
|
13
|
-
ポインタのポインタぐらいならよくあることです。
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
つまり、(*list)[0] が100文字以下の文字列の一番最初の文字を指すようになる。
|
18
|
-
|
19
|
-
(*list)[1] が100文字以下の文字列の二番目の文字を指すようになる。
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
list[1]="3DS"; のときに,あらかじめ確保していないメモリにアクセスしているから
|
24
|
-
|
25
|
-
segmentation fault になるんです。
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
だから、もしこのままできるだけ同じコードでプログラムを書くなら、
|
32
|
-
|
33
|
-
char *list[100]; を
|
34
|
-
|
35
|
-
char list[100][100]; としましょう。
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
これで、list[n] はn+1番目の100文字以下の文字列の、最初の文字を指すはずです。
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
1
|
+
プログラムの発想自体があまりよくないです。
|
46
2
|
|
47
3
|
同じデータが何個も格納されているのは無駄です。
|
48
4
|
|
3
\.
test
CHANGED
@@ -20,6 +20,14 @@
|
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
+
list[1]="3DS"; のときに,あらかじめ確保していないメモリにアクセスしているから
|
24
|
+
|
25
|
+
segmentation fault になるんです。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
23
31
|
だから、もしこのままできるだけ同じコードでプログラムを書くなら、
|
24
32
|
|
25
33
|
char *list[100]; を
|
2
\.
test
CHANGED
@@ -102,7 +102,9 @@
|
|
102
102
|
|
103
103
|
|
104
104
|
|
105
|
-
int n;
|
105
|
+
int n = rand()%100;
|
106
|
+
|
107
|
+
|
106
108
|
|
107
109
|
int get_idx(int n) {
|
108
110
|
|
@@ -162,10 +164,6 @@
|
|
162
164
|
|
163
165
|
}
|
164
166
|
|
165
|
-
|
166
|
-
|
167
|
-
int n = rand() % 100;
|
168
|
-
|
169
167
|
|
170
168
|
|
171
169
|
として、list[get_idx(n)]で文字列を決めるかな.
|
@@ -236,6 +234,10 @@
|
|
236
234
|
|
237
235
|
|
238
236
|
|
237
|
+
でp_image(n);
|
238
|
+
|
239
|
+
|
240
|
+
|
239
241
|
ってすればいいと思う。
|
240
242
|
|
241
243
|
|
1
・
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
char *list[100];と最初に宣言しているところで、char* 型を100個入れる配列を作っているのだと思ってるのでは?
|
2
2
|
|
3
|
-
おそらく質問者は
|
3
|
+
おそらく質問者は list[n] が、ひとつのchar*型のデータで、
|
4
|
-
|
4
|
+
|
5
|
-
|
5
|
+
nの値ごとに違う文字列になるのだと思っているのだと思いますが、違います。
|
6
6
|
|
7
7
|
|
8
8
|
|