C 中的 char *str="this is a string" 与 char *string = strdup("this is a string") 有什么区别

What is the diffrence between char *str="this is a string" from char *str = strdup("this is a string") in C

以下代码有什么区别:

char* str = "this is a string"

来自这个:

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

使用场景 ?

char *str = "this is a string"; 中,变量指向包含字符串内容的只读内存区域。

char *str = strdup("this is a string");中,变量指向一个16字节长的可写内存区域,程序必须在某个时候释放它以防止内存泄漏(或者,在出错的情况下,变量为NULL)。
另请注意,标准未描述 strdup(),某些实现可能无法编译此版本。

在此声明中

char *str="this is a string"; 

指针str指向字符串文字"this is a string"的第一个字符。 字符串文字 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

可以这样说,在第一种情况下,字符串的所有者是编译器,而在第二种情况下,字符串的所有者是程序员。:)

宣言

char* str = "this is a string";  

声明 str 一个指向字符串文字的指针。它不能被修改。虽然

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

声明 str 一个指向由 strdup 返回的动态分配内存的指针。在这种情况下 str 可以传递给 free