web-dev-qa-db-ja.com

strdupはどのように使用しますか?

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

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

私はこれを正しく行っていますか?または、ここで何か問題がありますか?

12
Ivan Zhang

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

したがって:

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

メモリ割り当てを行う必要がある場合は、variablestrlen(Word)+1バイトを割り当てる必要があります。その後、新しく割り当てられたスペースに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);
_

または、長さを1回計算して、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()がどこにあるかを確認することを忘れないでください。

21

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では問題なくC++では問題ないので、C++では注意してください。これは、演算子newの予約名であるためです。

9
hetepeperfan

あなたは混乱しているようです。ポインタについて知っていることを忘れてください。 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に通知することが期待されていたとします。

新しい値の生成には古い値が必要ですか? getcharがxを表示できない場合、どうすればよいですか?

コードを見てみましょう:

_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
_

古い値を取得する方法はありますか、それともビューから「漏出」していますか? mallocedメモリを使い終わったら、free(variable);を呼び出してOSに通知する必要があります。

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

参考までに、これがstrdupの実装例です。

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

    strcpy(duplicate, original);
    return duplicate;
}
_
6
autistic

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

単に言う

char* const variable = strdup(Word);
2
bitmask