以下代码之间的区别是什么:
char* str = "this is a string"
从这一个:
char* str = strdup("this is a string")
使用场景?
答案 0 :(得分:8)
在此声明中
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
可以说在第一种情况下,字符串的所有者是编译器,在第二种情况下,字符串的所有者是程序员。:)
答案 1 :(得分:3)
在char *str = "this is a string";
中,变量指向具有字符串内容的只读存储区。
在char *str = strdup("this is a string");
中,变量指向一个16字节长的可写内存区域,程序必须在某个时间释放以防止内存泄漏(或者,如果出错,则变量为NULL)。
另请注意,标准未描述strdup()
,某些实现可能无法编译此版本。
答案 2 :(得分:2)
声明
char* str = "this is a string";
声明str
指向字符串文字的指针。它无法修改。而
char* str = strdup("this is a string");
声明str
一个指向strdup
返回的动态分配内存的指针。在这种情况下,str
可以传递给free
。