次のコードの違いは何ですか:
char* str = "this is a string"
この 1 つから:
char* str = strdup("this is a string")
使用シナリオは?
次のコードの違いは何ですか:
char* str = "this is a string"
この 1 つから:
char* str = strdup("this is a string")
使用シナリオは?
この宣言では
char *str="this is a string";
ポインターstr
は、文字列リテラル「これは文字列です」の最初の文字を指します。文字列リテラルには、1) 静的な保存期間があり、2) 変更できない場合があります。
したがって
str[0] = 'T'; // undefined behaviour
free( str ); // undefined behaviour
この宣言では
char *str = strdup("this is a string");
ポインタ str は、文字列「this is a string」を含む、動的に割り当てられた文字配列の最初の文字を指します。1) 配列が不要になったらメモリを解放する必要があり、2) 配列内の文字を変更する必要があります。
str[0] = 'T'; // valid
free( str ); // valid
最初のケースでは文字列の所有者はコンパイラであり、2 番目のケースでは文字列の所有者はプログラマであると言えます。:)
宣言
char* str = "this is a string";
str
文字列リテラルを指すポインターを宣言します。変更できません。その間
char* str = strdup("this is a string");
str
によって返される動的に割り当てられたメモリを指すポインタを宣言しますstrdup
。この場合str
、 に渡すことができますfree
。