我是从PHP世界转到C语言的新手。我正在研究字符串(我知道C语言没有这种数据类型)。
我的问题是如何最好地“声明”字符串?
通过一些研究,我得出以下结论:
char str[40] = "Here is my text";
char str[] = "Here is my text";
char *str = "Here is my text";
我是从PHP世界转到C语言的新手。我正在研究字符串(我知道C语言没有这种数据类型)。
我的问题是如何最好地“声明”字符串?
通过一些研究,我得出以下结论:
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
指向的数据位于只读段,不可修改。这取决于您的需求,字符串是否需要可修改。
const char*
比 char *
更好。 - David HeffernanI. char *str = "这是我的文本";
a. 该字符串将被创建在只读内存部分。
b. 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
记得释放堆内存中的内存:free(copy)
II. char str[40] = "这是我的文本";
这将创建一个包含40个字符的数组。前15个字符将根据给定的值设置,其余的将为空。这将在堆栈内存中创建,因此您可以稍后修改该值。
例如,
str[0] = 'T'