私はstrdup
を呼び出しており、strdup
を呼び出す前に変数にスペースを割り当てる必要があります。
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(Word);
私はこれを正しく行っていますか?または、ここで何か問題がありますか?
POSIX標準 strdup()
を使用している場合は、必要なスペースを計算して割り当て、ソース文字列を新しく割り当てられたスペースにコピーします。 malloc()
を自分で行う必要はありません。実際、割り当てたスペースへの唯一のポインタをstrdup()
が割り当てたスペースへのポインタで上書きするため、これを行うとすぐにリークします。
したがって:
_char *variable = strdup(Word);
if (variable == 0) …process out of memory error; do not continue…
…use variable…
free(variable);
_
メモリ割り当てを行う必要がある場合は、variable
にstrlen(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()
がどこにあるかを確認することを忘れないでください。
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の予約名であるためです。
あなたは混乱しているようです。ポインタについて知っていることを忘れてください。 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
_
古い値を取得する方法はありますか、それともビューから「漏出」していますか? malloc
edメモリを使い終わったら、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;
}
_
現在のところ、常に4〜8バイト(アーキテクチャによって異なります)がリークしています。 strdup
に関係なく 必要な動的メモリを独自に割り当てます 新しく割り当てられたメモリ領域へのポインタを保持する唯一の変数を再割り当てします。
単に言う
char* const variable = strdup(Word);