12

を呼び出しstrdupており、呼び出す前に変数にスペースを割り当てる必要がありますstrdup

char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);

私はこれを正しく行っていますか?それとも、ここに何か問題がありますか?

4

4 に答える 4

21

POSIX 標準を使用している場合はstrdup()、必要なスペースが計算されて割り当てられ、ソース文字列が新しく割り当てられたスペースにコピーされます。自分で行う必要はありませんmalloc()。実際、割り当てたスペースへの唯一のポインターを、割り当てたスペースへのポインターで上書きするため、これを行うとすぐにリークしますstrdup()

したがって:

char *variable = strdup(word);
if (variable == 0) …process out of memory error; do not continue…
…use variable…
free(variable);

メモリ割り当てを行う必要がある場合は、strlen(word)+1バイトを割り当てる必要があり、新しく割り当てられたスペースにvariableコピーできます。word

char *variable = malloc(strlen(word)+1);
if (variable == 0) …process out of memory error; do not continue…
strcpy(variable, word);
…use variable…
free(variable);

または、長さを一度計算して、memmove()またはおそらく使用しmemcpy()ます。

size_t len = strlen(word) + 1;
char *variable = malloc(len);
if (variable == 0) …process out of memory error; do not continue…
memmove(variable, word, len);
…use variable…
free(variable);

free()すべての の がどこにあるかを確認することを忘れないでくださいmalloc()

于 2013-02-19T00:35:16.550 に答える
9

strdup で使用するためにスペースを割り当てる必要はありません。strdup がそれを行います。ただし、使用後は解放する必要があります。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (){

    const char* s1= "Hello World";
    char* new = strdup (s1);
    assert (new != NULL);

    fprintf( stdout , "%s\n", new);

    free (new);
    return 0;
}

編集: 変数名 new は C では問題なく、演算子 new の予約名であるため、C++ では問題ないため、C++ には注意してください。

于 2013-02-19T00:44:25.497 に答える
6

あなたは混乱しているようです。ポインターについて知っていることは忘れてください。int を操作しましょう。

int x;
x = rand();    // Let us consider this the "old value" of x
x = getchar(); // Let us consider this the "new value" of x

古い値を取得する方法はありますか、それともビューから「漏えい」していますか? 仮説として、OS がいくつかのクリーンアップ タスクを実行するために、その乱数の処理が終了したことを OS に知らせることが期待されていたとします。

新しい値の生成には古い値が必要ですか? getcharxが見えないのにどうしてですか?

あなたのコードを考えてみましょう:

char *variable;
variable = (char*) malloc(sizeof(char*)); // Let us consider this the "old value" of variable
variable = strdup(word);                  // Let us consider this the "new value" of variable

古い値を取得する方法はありますか、それともビューから「漏えい」していますか? mallocを呼び出して、ed メモリの処理が終了したことを OS に知らせる必要がありますfree(variable);

新しい値の生成には古い値が必要ですか? strdup変数が表示されない場合、どうすればよいでしょうか。

参考までに、strdup の実装方法の例を次に示します。

char *strdup(const char *original) {
    char *duplicate = malloc(strlen(original) + 1);
    if (duplicate == NULL) { return NULL; }

    strcpy(duplicate, original);
    return duplicate;
}
于 2013-02-19T01:18:35.100 に答える
2

現在のところ、常に 4 ~ 8 バイトがリークしています (アーキテクチャによって異なります)。どちらがstrdup必要な動的メモリを独自に割り当てるかに関係なく、新しく割り当てられたメモリ領域へのポインタを保持する唯一の変数を再割り当てしています。

簡単に言うと

char* const variable = strdup(word);
于 2013-02-19T00:38:22.403 に答える