0

-Wall -pedantic で ANSI C と gcc を使用する

構造体があり、そのデータをループで事前に入力します。後で、そこからレコードを削除する必要があります。レコード番号 3 としましょう。使用free(snode[2]);すれば十分でしょうか? レコード数は自動的に減りますか?


編集済み

struct stock_data 
{
    int ticket_price;
    int stock_level;
};

typedef struct stock_node 
{
    struct stock_data * data;
} stock_node;

stock_node * snode = NULL;

for(x = 0; x < 6; x++) {
   snode = (stock_node *) realloc(snode, x+1 * sizeof(stock_node));
   if (snode == NULL) { exit(1); }

   snode[x].data = (struct stock_data *) calloc(1, sizeof(struct stock_data));

   snode[count - 1].data->ticket_price = 100;

   snode[count - 1].data->stock_level = 10;

}
4

6 に答える 6

1

malloced メモリーを部分的に解放することはできません。メモリを解放するには、それぞれmallocに 1 つだけ存在する必要があります (その後、完全に解放されます)。free実際、または他の割り当て関数のいずれかfreeによって返される同じポインター以外の引数を与えることは、未定義の動作です。malloc

また、メモリmallocfreeどのように使用するかについての知識がないため、メモリに配列を入れることにしたことを知りませんstruct coinmalloc要求したバイト数を保持するのに十分な大きさのメモリ領域へのポインターを提供するだけで、それらをどのように使用するかはあなた次第です。

構造体を個別に管理する必要がある場合は、個別に割り当てられた構造体へのリンク リスト、またはポインターの配列を使用します。つまり、個別の呼び出しを使用して、リストまたは配列内のすべての要素を割り当てます。また、それらすべてを個別に、それぞれ 1 回だけmalloc割り当てる必要があることに注意してください。free

realloc編集: の代わりに表示するように質問を変更しましたmalloc。ただし、ここでも同じことが当てはまります。freeによって返されるポインターのみが可能でreallocあり、その一部ではなく、構造体の配列にメモリを使用していることもfree(またはrealloc) わかりません。それぞれを個別にcallocing しているので、その部分を個別に行うことができます(実際に行う必要があります)が、'ed 配列の一部にすることはできません。要素をing した後、手動でクリーンアップする必要があります。datafreefreereallocfreedata

于 2013-11-10T09:54:27.837 に答える
0

これは私が探していたものです。別の投稿

もう少し探せば良かった。そのために残念。

次の形式で 2 次元配列にメモリを割り当てると仮定しています。

int * arr = malloc(sizeof(int)*r*c);

代わりに、行ごとにメモリを割り当てると、行を削除する問題が単純化されます。

int * arr[r]; /*Declaring an array of pointers*/

/行ごとにメモリを割り当てる/

for(i=0; i<r; i++)       arr[i] = malloc(sizeof(int)*c);

....

/行は削除する行を示します/

free(arr[row]);
for(i=row; i<r-1; i++)    arr[i] = arr[i+1];
于 2013-11-10T10:31:22.537 に答える
0

free()から返されたポインターのみを使用できますmalloc()。配列を割り当てた場合、そのstruct temp_coin*一部を解放することはできません。を使用して配列全体を解放する必要がありますfree(temp_coin)

によって返されないポインタを解放しようとするとmalloc()、メモリの破損や未定義の動作などの悪いことが起こります。

于 2013-11-10T09:56:07.760 に答える
0

*free(temp_coin[2]); を使用する場合 それで十分でしょうか? *

いいえ - 未定義の動作です。あなたがmalloc'edしたものは、解放する必要があります。すなわち。無料temp_coin

レコード数は自動的に減りますか?

そもそもレコード数がない

PS mallocでキャストは必要ありません

于 2013-11-10T09:56:20.483 に答える
0

メモリ管理の粒度が必要な場合は、リンクされたリストを使用できます。

于 2013-11-10T10:03:00.440 に答える
0

使えばfree(temp_coin[2]);足りますか?レコード数は自動的に減りますか?

もちろん違います。その方法をどのように知る必要がありますか?これは C です。非常に明確にする必要があります。

他の人が言ったように、 ed エリアfree()専用に使用する必要があります。malloc()それ以外はすべて、プロセスのデータ領域を完全に破壊する可能性があります。さらに言えば、未定義の動作であるため、何でも発生する可能性があります。

たとえばfree()、指定されたアドレスの前の場所(ところで、temp_coin[2]はアドレスではなく、ここstruct coinに a が&ありません...)が割り当てられたバイト数であると想定する場合があります。malloc()これは、パートナー関係がこのように定義されている場合に当てはまります。ただし、他のアドレスを指定すると、この部分がフリーリストに追加され、元のメモリ部分のサイズがそのままになる可能性があります。それを解放すると、解放された「サブパーツ」がフリーリストに 2 回存在します。そして、トラブルが始まります。

代わりに、削除するアイテムの後ろにあるものをコピーして、最初の一歩を踏み出します。次に、リスト内のエントリの数を 1 ずつ調整し (それを保存した場所はどこでも)、次に、おそらく今、または後で、割り当てられたメモリ ブロックのサイズを調整して、データに正確に収まるようにします。

ユースケースによっては、呼び出しrealloc()の頻度を減らし、すべてを事前に割り当てておく方が賢明な場合があることに注意してください。もちろん、実際に割り当てられたサイズをどこかに記録する必要があります。

于 2013-11-10T10:06:52.243 に答える