[C] 初期化の必要性

コンパイラ作成のプロジェクトはDocker上のUbuntuで行なっているのですが、WindowsのWSL, VirtualBox上のDebian9.5ではテストが通りませんでした。 環境が違うから仕方ないと思っていたのですが、調べてみると初期化もれが原因でした。 ### 問題のコード ```c `gutter:true; // 可変長ベクタ typedef struct { void **data; // データ本体 int capacity; // バッファサイズ (data[0]からdata[capacity-1]がバッファの領域 int len; // ベクタに追加済みの要素の個数 (len == capacityの時にバッファがfull) } Vector; // Vectorを作成する Vector *new_vector() { Vector *vec = malloc(sizeof(Vector)); vec->data = malloc(sizeof(void *) * 16); vec->capacity = 16; return vec; } ``` Vectorを作成するnew_vector関数ですが、構造体のlenの値を初期化していませんでした。 この状態で動作させると、lenのサイズが不定になって、動作が不安定になっていました。 ```c `gutter:true; highlight:13; // 可変長ベクタ typedef struct { void **data; // データ本体 int capacity; // バッファサイズ (data[0]からdata[capacity-1]がバッファの領域 int len; // ベクタに追加済みの要素の個数 (len == capacityの時にバッファがfull) } Vector; // Vectorを作成する Vector *new_vector() { Vector *vec = malloc(sizeof(Vector)); vec->data = malloc(sizeof(void *) * 16); vec->capacity = 16; vec->len = 0; return vec; } ``` 初期化処理を入れる事でWindowsのWSL, VirtualBox上のDebian9.8でも動作させることができました。 当たり前だけど大切な初期化処理、気をつけていきたいです。

0 件のコメント :

コメントを投稿