スタックの実装に問題があります。プッシュ関数は、関数に送信する値を操作して変更します。これを構築するさまざまな方法を試しましたが、機能しないか、出力が破損します。
基本的な考え方は、以下のとおりです。注意:私のポップ機能は1つの位置だけを歩き、特定の位置でメモリを解放しません。スレッドを操作しているので、strcpyを使用できません。
strdupはコピーする値を変更しますか、そのような情報は見つかりません。重複した後は値を使用できると考えられます。
そして、どうですか正しいすでに割り当てられているメモリスペースでstrdupを使用する方法は、単に解放してから再度使用することはできないと思います。
void stack_push(Stack *s, char *value)
{
if (s->size == s->capacity) {
realloc_stack(s);
}
if(s->data[s->size] == NULL){
// The current position does not contain any data.
s->data[s->size] = strdup(value);
}
else{
free(s->data[s->size]);
s->data[s->size] = strndup(value, strlen(value) + 1);
}
s->size += 1;
}
編集s->data = char ** data
回答 2 件
strdup
引数を変更することはありません。あなたがのプロトタイプを見ればstrdup
そのパラメータが宣言されていることがわかりますconst
、これは変更されていないことを意味します。strdup
次のように実装できます。char* strdup(const char* s) { char* n = malloc(strlen(s) + 1); if (n) strcpy(n, s); return n; }
魔法はありません。
使用できます
strcpy
ちなみにスレッド付き。だがstrdup
正常に動作します。
関連記事
- すべてのメンバーに割り当てられたメモリを使用して、ヒープ上に構造体の配列を作成します
- Javaメソッドは、戻り値の型に基づいて異なるメモリサイズを割り当てられていますか
- new []によって割り当てられたメモリを解放する方法
- JavaScriptで新しいオブジェクトを作成した場合、関数のすべてのプロパティに新しいメモリが割り当てられませんか?
- mainでメモリを動的に割り当てたときに、関数でassert()を処理する方法は?
- オーバーフローの場合にメモリ内で隣接して割り当てられた変数はどうなりますか
- CPythonのスタック上のポインターにメモリが割り当てられていますか?
- 埋め込みc:プログラムがクラッシュしたときに割り当てられたメモリを解放する方法
- 終了するときに、割り当てられたメモリを解放する必要がありますか?
strdup
基本的にこれです(簡潔さのエラーチェックはありません):あなたはそれをこのように使います:
今、あなたはあなた自身の質問に答えることができるはずです。