コンパイラ作成でポインターの演算処理を実装していて、mallocの使い方が間違っていて悩みました。
(ポインターとハンドルをちゃんと理解しておりませんでした)
### 問題のコード
テスト用に連続したintの領域を確保するalloc4を作成するのですが、どうもsegmentation faultになってしまいました。
(その前にstdlibをインクルードしていなかったのは悲しいミス)
```c
`gutter:true;
#include <stdlib.h>
void alloc4(int **p, int a, int b, int c, int d) {
*p = (int *)malloc(sizeof(int) * 4);
*p[0] = a;
*p[1] = b;
*p[2] = c;
*p[3] = d;
}
```
イメージ的には、intの領域を4つ確保して、先頭から値を入れていく想定です。
### 問題点
mallocで領域を確保するのは良いのですが、そのあとの値の代入に問題がありました。
ポインターのサイズは8バイトですが、intの領域は4バイト単位で確保されるので、割り当てられたメモリ領域の外を参照していました。
### 解決策
キャストしても良いですが、intのポインターを用意してそちらを使うように修正しました。
```c
`gutter:true; highlight:4;
#include <stdlib.h>
void alloc4(int **p, int a, int b, int c, int d) {
int *int_ptr = (int *)malloc(sizeof(int) * 4);
int_ptr[0] = a;
int_ptr[1] = b;
int_ptr[2] = c;
int_ptr[3] = d;
*p = int_ptr;
}
```
0 件のコメント :
コメントを投稿