コンパイラ作成のプロジェクトは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 件のコメント :
コメントを投稿