2

以下代码有什么区别:

char* str = "this is a string"

从这个:

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 指向动态分配的字符数组的第一个字符,该数组包含字符串“这是一个字符串”。您 1)必须在不再需要数组时释放内存,并且 2)您可以更改数组中的字符。

str[0] = 'T'; // valid
free( str ); // valid

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

于 2015-06-06T09:12:20.950 回答
3

char *str = "this is a string";变量中指向一个带有字符串内容的只读内存区域。

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

于 2015-06-06T09:12:18.367 回答
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 回答