質問するログイン新規登録

回答編集履歴

2

追記

2019/10/22 14:57

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -64,7 +64,8 @@
64
64
  32767
65
65
  ```
66
66
 
67
- 実行結果は毎回変わり得ます。そそも実行できる保証もありません
67
+ 実行結果は毎回変わり得ます。それこ全部1になっておかしくありません。
68
+ そもそも実行できる保証もありませんが。
68
69
 
69
70
  ---
70
71
  ともかく、次のように明示的に初期化してやる必要があります。

1

追記

2019/10/22 14:57

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,3 +1,5 @@
1
+ 問題点1
2
+ ---
1
3
  配列の使い方を間違えています。
2
4
  例えば、この部分は見るからにおかしいです。
3
5
  > ```C
@@ -23,4 +25,49 @@
23
25
  ```
24
26
 
25
27
  後者のコードのような範囲外アクセスは未定義動作を引き起こします。
26
- 実行環境に依って動作に差異が出ても何ら不思議ではありません。
28
+ 実行環境に依って動作に差異が出ても何ら不思議ではありません。
29
+
30
+ 問題点2
31
+ ---
32
+ > ```C
33
+ if (card[i][j] != 1){
34
+ > ```
35
+
36
+ ご提示のコードを書く際、一つ思い込みをしているように思います。
37
+ **『配列の要素は、最初から何らかの数で埋められているのだ』**... 残念ながら、それは間違いです。
38
+
39
+ 次のように実際に試してみることができます。
40
+ ```C
41
+ #include <stdio.h>
42
+
43
+ int main(void) {
44
+ int arr[10];
45
+ for(int i = 0; i < 10; ++i) {
46
+ printf("%d\n", arr[i]);
47
+ }
48
+
49
+ return 0;
50
+ }
51
+ ```
52
+
53
+ **実行結果** [Wandbox](https://wandbox.org/permlink/oq4EF3gJHdFdaaTA)
54
+ ```
55
+ 0
56
+ 0
57
+ 0
58
+ 0
59
+ 4195600
60
+ 0
61
+ 4195328
62
+ 0
63
+ 787312336
64
+ 32767
65
+ ```
66
+
67
+ 実行結果は毎回変わり得ます。そもそも実行できる保証もありませんが。
68
+
69
+ ---
70
+ ともかく、次のように明示的に初期化してやる必要があります。
71
+ ```C
72
+ int card[4][13] = {0};
73
+ ```