【发布时间】:2015-06-06 09:07:14
【问题描述】:
以下代码有什么区别:
char* str = "this is a string"
从这个:
char* str = strdup("this is a string")
使用场景?
【问题讨论】:
标签: c pointers c-strings string-literals strdup
以下代码有什么区别:
char* str = "this is a string"
从这个:
char* str = strdup("this is a string")
使用场景?
【问题讨论】:
标签: c pointers c-strings string-literals strdup
在此声明中
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
可以说,第一种情况下字符串的所有者是编译器,第二种情况下字符串的所有者是程序员。:)
【讨论】:
在char *str = "this is a string"; 中,变量指向带有字符串内容的只读内存区域。
在char *str = strdup("this is a string"); 中,变量指向一个 16 字节长的可写内存区域,程序必须在某个时候释放该区域以防止内存泄漏(或者,如果发生错误,变量为 NULL)。
另请注意,标准未描述strdup(),某些实现可能无法编译此版本。
【讨论】:
声明
char* str = "this is a string";
声明str 指向字符串文字的指针。它不能被修改。而
char* str = strdup("this is a string");
声明str 指向由strdup 返回的动态分配内存的指针。在这种情况下,str 可以传递给free。
【讨论】: