在C中“声明”字符串的最佳方法

时间:2011-10-04 17:46:45

标签: c

我是C世界的新手(来自PHP)。我正在玩字符串(我知道没有这种类型的数据)。

我的问题是哪个是“声明”字符串的最佳方式?

通过一些研究我得出了这个。

char str[40] = "Here is my text";
char str[]   = "Here is my text";
char *str    = "Here is my text";

3 个答案:

答案 0 :(得分:11)

这取决于您的需求。

char str[40] = "Here is my text";

这将分配一个包含40个字符的数组。将根据指定的字符串设置前15个字符。其余的将被设置为空。如果您稍后需要修改字符串,但这知道它不会超过40个字符(或39个字符后跟空终止符,具体取决于上下文),这非常有用。

char str[] = "Here is my text";

这与上面的示例相同,只是str现在限制为包含16个字符(15个字符串+空终止符)。

char *str = "Here is my text";

str现在是一个指向15个字符的字符串的指针(加上一个空终止符)。您无法修改字符串本身,但可以将str指向其他位置。在某些环境中,这不是强制执行的,您实际上可以修改字符串内容,但这不是一个好主意。 如果您确实需要使用指针并修改字符串本身,则可以复制它:

char *str = strdup("Here is my text");

但是你需要free(str)或者你的代码会泄漏内存。

答案 1 :(得分:6)

char str[40] = "Here is my text";
char str[]   = "Here is my text";

str可以修改。所以,

str[0] = 'M'; 

但是,

char *str    = "Here is my text";

str[0] = 'M'; // Not possible.

str指向数据驻留在只读段上,不可修改。这一切都取决于你想要什么,字符串是否需要可修改。

答案 2 :(得分:1)

<强> I 即可。 char *str = "Here is my text";

一个。该字符串将在只读存储器部分中创建。

str指针变量将在内存的堆栈部分创建(假设所有这些都发生在函数内)

℃。 str将指向步骤&#39; a&#39;

中创建的字符串的内存地址

enter image description here

因此,您无法修改以这种方式创建的字符串,因为它是在内存的只读部分中创建的。如果在创建该字符串后尝试修改该字符串,则操作未定义,您将收到运行时错误。

解决此问题的一种方法是strdup。 strdup将在堆内存中创建一个字符串的副本,允许您自由地修改字符串。

例如:

char *fruit = apple //This will be created in const portion of memory,can't modify
char *copy = strdup(fruit) //This will create a copy of the string pointed by fruit in heap
  

请记住在堆中释放内存:free(copy)

<强> II 即可。 char str[40] = "Here is my text";

这将创建一个包含40个字符的数组。前15个将根据给定的值设置,其余的将为空。这将在堆栈内存中创建,因此您可以稍后修改该值。

例如,

str[0] = 'T'