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

9

我是从PHP世界转到C语言的新手。我正在研究字符串(我知道C语言没有这种数据类型)。

我的问题是如何最好地“声明”字符串?

通过一些研究,我得出以下结论:

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

1
欢迎来到C语言世界 :P 阅读comp.lang.c faq,了解C程序员面临的(不太)基本问题集。 - pmg
感谢您提供的链接,非常有用! - user979009
你可能也会对之前的一个问题的这个答案感兴趣。 - Steve Summit
3个回答

12

这取决于您的需求是什么。

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),否则你的代码将会泄露内存。


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指向的数据位于只读段,不可修改。这取决于您的需求,字符串是否需要可修改。


你说 char *str = "text; str[0] = "M" 是不可变的。但是如果我做 char *p = "new"; p = "other string" 就可以工作。为什么?我错过了什么吗? - user979009
1
@user979009:你写的语句正在改变指针,而不是字符串的内容;请参考Ferruccio的答案。 - Matteo Italia
2
const char*char * 更好。 - David Heffernan

1

I. char *str = "这是我的文本";

a. 该字符串将被创建在只读内存部分。

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

c. str 将指向步骤 'a' 中创建的字符串的内存地址。

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] = "这是我的文本";

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

例如,

str[0] = 'T'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接