
コンパイラ作成でポインターの演算処理を実装していて、mallocの使い方が間違っていて悩みました。
(ポインターとハンドルをちゃんと理解しておりませんでした)
問題のコード
テスト用に連続したintの領域を確保するalloc4を作成するのですが、どうもsegmentation faultになってしまいました。
(その前にstdlibをインクルードしていなかったのは悲しいミス)
1 2 3 4 5 6 7 8 9 | #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のポインターを用意してそちらを使うように修正しました。
1 2 3 4 5 6 7 8 9 10 11 | #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 件のコメント :
コメントを投稿