NeiNeigh's blog

覚書のようなブログ.PC・アプリケーション・プログラミング・オーディオ・アニメ

C言語でのmalloc凡ミス

構造体をmallocしてfreeしてたらなんかしらんけどエラーでた.

ソースコード

typedef struct _item{
    char *key; //このkeyをfreeするとエラー
    char *value;
    struct _item *next;
    struct _item *pre;
} item;

int main(){
    item *it = (item *)malloc(sizeof(item *));
    it->key = strdup("key");
    it->value = strdup("value");
    it->next = NULL;
    it->pre = NULL;

    printf("start\n");
    free(it->key);
    printf("free:key\n");
    free(it->value);
    printf("free:value\n");
    free(it);
}

実行結果

*** Error in `./a.out': free(): invalid pointer: 0x0000000000ee8030 ***

この下にBacktraceとMemory mapが続く.でもみてもわかんない.

keyのfreeは出来ないが,なぜかvalueはfreeできる.構造体it自体もfreeすると同じエラーがでる.(構造体自体をfreeするとメンバ(key)も自動的にfreeされるため?)

原因

main()で最初に行うnextとpreの初期化を消したら普通に実行できた.
解決策にはなってないけど,現状ではこうするしかない.
わからない.
と,思ったけど普通に構造体のmallocが間違ってる.
main()の最初を

    item *it = (item *)malloc(sizeof(item));

このように変更すればいい.超恥ずかしい.
戒めとして残す.