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

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

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

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

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

这取决于您的需求。

 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)或你的代码会泄漏内存。

 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指向数据驻留在只读段上,不可修改。 这一切都取决于你想要什么,字符串是否需要可修改。

char *str = "Here is my text";

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

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

C。 str将指向在​​步骤’a’中创建的字符串的内存地址

在此处输入图像描述

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

克服这个问题的一种方法是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 

记得在堆中释放内存:免费(复制)

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

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

例如,

 str[0] = 'T'