我是C世界的新手(来自PHP)。我正在玩字符串(我知道没有这种类型的数据)。
我的问题是哪个是“声明”字符串的最佳方式?
通过一些研究我得出了这个。
char str[40] = "Here is my text";
char str[] = "Here is my text";
char *str = "Here is my text";
答案 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;
中创建的字符串的内存地址因此,您无法修改以这种方式创建的字符串,因为它是在内存的只读部分中创建的。如果在创建该字符串后尝试修改该字符串,则操作未定义,您将收到运行时错误。
解决此问题的一种方法是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'