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
。
以下代码有什么区别:
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
。