参照渡しで値が全部同じになるミスをした

やってしまいました。

純化したコードですが、下記のようなことをしてしまいました。

int main (void) {
    int *num[10];
    int i;
    
    for(i=0;i<10;++i){
        int data = i;
        num[i] = &data;
    }
    
    for(i=0;i<10;++i){
        printf("%d ",*num[i]);
    }
    
    return 0;
}
$ main
9 9 9 9 9 9 9 9 9 9

予定では「0 1 2 3 4 5 6 7 8 9」と表示されるはずでした。

ですが最後の要素のポインタで上書きされています。

これはつまり変数dataの宣言を局所的にしても、使用されるアドレスは同じだということになりますね。

しかもよくよく考えたらdataは一つ目のforループで局所的にしてる変数なので本来ループを抜けた時点で消えてしまうので値の不定な変数になるはずなのでどっちにしてもこのコードはバグバグですね。

でもこれ気をつけないとダメですね。上のコードはかなり単純なコードですが、僕が実際にハマってしまったのはループの中で宣言したchar型の配列をポインタで自作関数に渡し、その関数の中で受け取ったポインタを保存するという処理をしていたのです。

なのでこういう場合はポインタを保存するのではなく、strcpy等を使って実際の値を保存しないといけないですね。次からは慎重にやります。