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

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

コメントを投稿