0
int size_of_daten = 5;
char *data[size_of_daten];
char *normal_Pointer = (char*)malloc(sizeof(char) * 100);
int i;

for(i=0; i<size_of_daten; i++) {
    data[i] = (char*)malloc(sizeof(char) * 100);
}

data[0] = "0";
data[1] = "1";
data[2] = "2";
data[3] = "3";
data[4] = "4";

printf("data[2] %s\n",data[2]);

strcpy(normal_Pointer,data[2]);

for(i=0; i<size_of_daten; i++) {
   free(data[i]);
}

free(data);

私はこれを試しました...配列をマロックしながら解放しました...また、の値をコピーしてdata[2]ポイントしませんでした...それで問題はないはずです...

4

4 に答える 4

3

"0"文字列など"1"を配列にコピーしようとしています。文字列のコピーdataに使用するだけでなく=、のような文字列ライブラリメソッドを使用する必要がありますstrcpy

配列要素にこれらのリテラル文字列を割り当てると、たとえばdata[0]= "0"; 、配列要素は割り当てたメモリを指さなくなり、自分のものではないメモリを指して、を使用できなくなりますfree。からメモリブロックへの参照が失われmalloc、メモリリークが発生しました。

free(data);さらに、:を使用して割り当てられていないため、実行できません。これはmalloc、スタックに割り当てられた配列です。

于 2012-08-27T17:17:55.673 に答える
3

charこれは、以前に割り当てたの配列にデータをコピーする方法ではありません。

data[0]= "0";
data[1]= "1";
data[2]= "2";
data[3]= "3";
data[4]= "4";

5つの新しいポインタのアドレスでポインタを上書きしています。この時点で、割り当てたメモリのアドレスを失いましたfree。呼び出すと、静的に割り当てられた文字列で呼び出しています"0"

strcpyある文字配列から別の文字配列にバイトをコピーするには、を使用する必要があります。

strcpy(dest[0], "0");
strcpy(dest[1], "1");
/* etc */
于 2012-08-27T17:18:23.917 に答える
1

まず、割り当て後の data の要素への割り当ては、以前に割り当てられたメモリをリークします。char * を割り当てるときは、char * のみを割り当てます。文字列はコピーされず、ポインタが上書きされます。

次に、スタックで宣言されたデータを解放しています。以下を使用してデータを定義します。

char *data[size_of_daten];

これは、文字ポインターのスタック上の配列を記述します。関数が戻ると範囲外になり、手動で解放すると爆発します。

于 2012-08-27T17:21:40.203 に答える
1

によって返されたマロケートされたdata[0]= "0"アドレスを上書きしていますmalloc。代わりにすべきことは

strcpy(data[0], "0");
strcpy(data[1], "1");
...
于 2012-08-27T17:19:50.783 に答える