[C] コンパイラ作成 mallocの使い方が間違っていた

コンパイラ作成でポインターの演算処理を実装していて、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 件のコメント :

コメントを投稿