回答編集履歴

5

たぶんわかった

2016/10/03 10:04

投稿

退会済みユーザー
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

\.\.

2016/10/03 10:04

投稿

退会済みユーザー
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

\.

2016/10/03 09:51

投稿

退会済みユーザー
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

\.

2016/10/02 20:24

投稿

退会済みユーザー
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

2016/10/02 20:10

投稿

退会済みユーザー
test CHANGED
@@ -1,8 +1,8 @@
1
1
  char *list[100];と最初に宣言しているところで、char* 型を100個入れる配列を作っているのだと思ってるのでは?
2
2
 
3
- おそらく質問者は *(list[n]) が、ひとつのchar*型のデータを指すことになり
3
+ おそらく質問者は list[n] が、ひとつのchar*型のデータ
4
-
4
+
5
- それがnの値ごとに違う文字列になるのだと思っているのだと思いますが、違います。
5
+ nの値ごとに違う文字列になるのだと思っているのだと思いますが、違います。
6
6
 
7
7
 
8
8