2

次のコードの違いは何ですか:

char* str = "this is a string"

この 1 つから:

char* str = strdup("this is a string")

使用シナリオは?

4

3 に答える 3

9

この宣言では

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 番目のケースでは文字列の所有者はプログラマであると言えます。:)

于 2015-06-06T09:12:20.950 に答える
2

宣言

char* str = "this is a string";  

str文字列リテラルを指すポインターを宣言します。変更できません。その間

char* str = strdup("this is a string");  

strによって返される動的に割り当てられたメモリを指すポインタを宣言しますstrdup。この場合str、 に渡すことができますfree

于 2015-06-06T09:15:26.010 に答える