21

文字列を c の構造体文字列変数にコピーしようとしているプログラムに問題があります。文字列をコピーした後、構造体文字列変数にコピーされた一時文字列変数を解放しようとしています。しかし、文字列を解放しようとすると、プログラムがオンになり、「解放されるポインターが割り当てられていません」と表示されます。何が起こっているのか正確にはわかりません。

char str[]="       ";           //temporary string to copy to structs string
str[3]=s;                       //putting a char s in middle
strcpy(matrix[i-1][j].c, str);  //copying the string
free(str);                      //freeing str that now is useless when copied
4

5 に答える 5

34

またはへmalloc()の呼び出しによって返されるポインターのみを(ヒープ上に動的に割り当てられたメモリ) に渡すことができます。セクション7.20.3.2からC99 標準のフリー関数:realloc()calloc()free()

free 関数は、ptr が指すスペースの割り当てを解除します。つまり、さらに割り当てられるようにします。ptr がヌル ポインターの場合、アクションは発生しません。それ以外の場合、引数が calloc、malloc、または realloc 関数によって以前に返されたポインターと一致しない場合、または空間が free または realloc の呼び出しによって解放された場合、動作は未定義です。

投稿されたコードでstrは、動的に割り当てられていませんが、スタックに割り当てられており、スコープ外になると自動的に解放され、free()d する必要はありません。

于 2012-10-30T21:54:05.070 に答える
11

気をつけて。このコードは、次の 2 つの点について混乱を示しています。

  1. スタックメモリとヒープメモリの違い
  2. の操作strcpy

ポイント1

これはある意味ですでに回答されていますが、少し拡張します。

ヒープは、動的メモリがプロセスに与えられる場所です。malloc(および関連する関数)を呼び出すと、ヒープにメモリが返されます。free使い終わったら、このメモリを使用する必要があります。

スタックは、プロセスの実行状態の一部です。通常の変数が格納される場所です。関数を呼び出すと、その変数がスタックにプッシュされ、関数の終了時に自動的にポップされます。あなたのstr変数は、スタック上にあるものの例です。

ポイント2

cマトリックス配列のそのメンバーが何であるか知りたいです。それがポインターの場合、何が機能するかについて混乱する可能性がありますstrcpy。この関数は、メモリのある部分から別の部分に文字列のバイトをコピーするだけです。したがって、メモリが利用可能でなければなりません。

cchar配列 (文字列を保持するのに十分な数の要素) の場合、これは問題ありません。しかし、cがポインタの場合、を使用する場合は、すでにメモリを割り当てている必要strcpyがあります。strdup文字列に十分なメモリを割り当て、それをコピーし、ポインタを返す代替関数があります。freeポインターが不要になった場合は、そのポインターを使用する責任があります。

于 2012-10-30T22:04:27.270 に答える
3

使わfreeずに使いmallocました。割り当てられていないメモリを解放することはできません。

于 2012-10-30T22:35:38.260 に答える
1

コードは文字列にメモリを割り当てません。ある文字列から別の文字列 (スペースの文字列) が使用するメモリに文字列をコピーするだけです。

メモリは、 などmalloc()の関数を使用して割り当てられrealloc()、 で解放されfree()ます。このメモリはそのように割り当てられていないため、アドレスを に渡すとfree()エラーが発生します。

于 2012-10-30T21:56:53.427 に答える
1

malloc()のヒープにスペースを割り当てるために使用しませんでしたstr。したがって、strはスタックに割り当てられ、 で割り当てを解除することはできませんが、スコープ外free()になると割り当てが解除strされます。つまり、宣言を含む関数が戻った後です。

于 2012-10-30T21:58:18.620 に答える