auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語のint型の配列を初期化しなかったらバグった

auです。

今回は、C言語でint型の初期化をしなかったら痛い目を見たので記事にしようと思います。

こんな感じのプログラムを組みました。
動かす前は、「word = 1」のような感じで結果が返ってくると思っていました。
しかし、実際に動かしてみると全然違う結果が返ってきました。

#include <stdio.h>

int main(void) {
    int count[52];
    char word[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    for (int j = 0; j < 52; j++) {
    count[j]++;
        printf("%c = %d\n", word[j], count[j]);
    }

    return 0;
}

// 実行結果
A = 1
B = 1
C = 1
D = 1
E = 1
F = 1
G = 1
H = 1
I = 1
J = 1
K = 1
L = 1
M = -578158376
N = -745510524
O = -347248135
P = 32767
Q = -347248359
R = 32767
S = 2
T = 1
U = -347248319
V = 32767
W = -347248335
X = 32767
Y = -347248383
Z = 32767
a = 169026517
b = 2
c = -347248359
d = 32767
e = 74616833
f = 2
g = -347248335
h = 32767
i = -347248359
j = 32767
k = 169022753
l = 2
m = 1
n = 2
o = 169022025
p = 2
q = 1
r = 1
s = 1
t = 1
u = 1
v = 1
w = 1
x = 1
y = 1
z = 1

結果は悲惨ですごい数になっていたり、1とか2でした。

そこから色々と試しましたが、「int型の配列の初期化」をしたら正常に動かすことが出来ました。

#include <stdio.h>

int main(void) {
    int count[52] = {0};
    char word[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    for (int j = 0; j < 52; j++) {
        count[j]++;
        printf("%c = %d\n", word[j], count[j]);
    }

    return 0;
}

// 実行結果
A = 1
B = 1
C = 1
D = 1
E = 1
F = 1
G = 1
H = 1
I = 1
J = 1
K = 1
L = 1
M = 1
N = 1
O = 1
P = 1
Q = 1
R = 1
S = 1
T = 1
U = 1
V = 1
W = 1
X = 1
Y = 1
Z = 1
a = 1
b = 1
c = 1
d = 1
e = 1
f = 1
g = 1
h = 1
i = 1
j = 1
k = 1
l = 1
m = 1
n = 1
o = 1
p = 1
q = 1
r = 1
s = 1
t = 1
u = 1
v = 1
w = 1
x = 1
y = 1
z = 1

今度は思っていたような結果を出すことが出来ました。

初期化をしないとバグる場面ってどんな時なんだろうなと思っていたので、それに巡り会えたので若干嬉しかったです。