2016-04-01 12 views
2

配列を解放しようとすると文字列(char *)の配列を作成する必要があるプロジェクトで作業しています。配列は、 "ダブルフリーまたは破損"が与えられ、私は問題を把握できませんでした。Cで文字配列の配列を解放しようとすると、空きまたは破損が二重に発生する

ここでは、コード抽出が単純化されたバージョンである、それは無意味に思えるかもしれませんが、それは私が直面しています問題を示しています。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char **cptr; 
    int i; 

    cptr = malloc(256*sizeof(char)); 
    for (i=0; i<256; i++) { 
     cptr[i] = calloc(2, sizeof(char)); 
     cptr[i][0] = (char)i; 
    } 
    for (i=0; i<256; i++) { 
     free(cptr[i]); 
    } 
    free(cptr); 

    return 0; 
} 

はありがとうを。

+3

'256 * sizeof(char *)'はあなたに256ポインタを与えます –

答えて

5
cptr = malloc(256 * sizeof(char)); 

上記の行が間違っています。上に割り当てられたバイト数を計算しても、それは256バイトです。マシンのポインタのサイズが4バイトであれば、64個のポインタで十分でしょう。代わりに、256のポインタが必要です。使用

cptr = malloc(256 * sizeof(char *)); 
+0

すべてが今理にかなっています。一方、プログラムをデバッグしようとすると、 'for(i = 0; i <256; i ++){printf("%d "、i);自由(cptr [i]); } 'と表示され、ターミナルに0が表示されるとエラーが表示されます。しかし、cptrにはいくつかのポインタのための十分なスペースが必要です(ポインタが4バイトであれば、少なくとも64個のポインタのためのスペースがあります)。しかし、最初のポインタを解放すると既に問題が生じていたようです。これを説明する特別な理由はありますか?ありがとうございました。 –

+1

@ user3259983 c [i] = calloc ..を使用すると、何も意味しない未定義のビヘイビアがトリガされているよりも、すでに多くのバイトを消費しています(http://www.slideshare.net/GiorgiMoniava/introduction-to-undefined c-c-c-c)が起こる可能性があります。 c [i]は4バイトを消費する。 –

+0

このようなエラーを避けるために、計算で指さしている要素のサイズ(つまり、 'cptr = malloc(256 * sizeof * cptr)')を使用するのは半慣用的です。もちろん、 '*'が抜けていても同じことが可能ですが、イディオムに慣れていれば、少なくとも眉毛が浮かび上がるはずです。 –

関連する問題