【问题标题】:What is the diffrence between char *str="this is a string" from char *str = strdup("this is a string") in Cchar *str="this is a string" from char *str = strdup("this is a string") 在 C 中有什么区别
【发布时间】: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


【解决方案1】:

在此声明中

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

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

【讨论】:

  • 声明不仅仅是声明:它们是定义
  • @pmg 没有矛盾。定义同时也是声明。:)
  • 谢谢你这么快的回复,你的回答对我很有用。
  • 所有定义都是声明;有些声明不是定义:)
【解决方案2】:

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

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

【讨论】:

  • 谢谢,答案很详细。
  • 对我也有用。^_^
【解决方案3】:

声明

char* str = "this is a string";  

声明str 指向字符串文字的指针。它不能被修改。而

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

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

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2018-06-27
    • 2018-10-11
    相关资源
    最近更新 更多