bugfix> c > 投稿

スタックの実装に問題があります。プッシュ関数は、関数に送信する値を操作して変更します。これを構築するさまざまな方法を試しましたが、機能しないか、出力が破損します。

基本的な考え方は、以下のとおりです。注意:私のポップ機能は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 基本的にこれです(簡潔さのエラーチェックはありません):

    char *strdup(const char *stringtoduplicate)
    {
      char *newstring = malloc(strlen(stringtoduplicate) + 1);
      strcpy(newstring, stringtoduplicate);
      return newstring;
    }
    
    

    あなたはそれをこのように使います:

    char Foo[] = "Bar";
    char *newBar = strdup(Foo);
    Foo[0] = 'F';
    printf("%s %s\n", Foo, newBar);   // prints: Far Bar
    ...
    free(newBar);     // once you're done with newBar, free it
    
    

    今、あなたはあなた自身の質問に答えることができるはずです。

  • strdup 引数を変更することはありません。あなたがのプロトタイプを見れば strdup そのパラメータが宣言されていることがわかります const 、これは変更されていないことを意味します。

    strdup 次のように実装できます。

    char* strdup(const char* s) {
        char* n = malloc(strlen(s) + 1);
        if (n) strcpy(n, s);
        return n;
    }
    
    

    魔法はありません。

    使用できます strcpy ちなみにスレッド付き。だが strdup 正常に動作します。

あなたの答え