如何在C语言中声明字符串

119
能有人给我解释一下这些代码行之间的区别吗?
char *p = "String";
char p2[] = "String";
char p3[7] = "String";

在什么情况下我应该使用上述每个选项?

31
那最后一个是缓冲区溢出,这很不错。 - Dan
3
第三个例子应该是 p3[6]:你必须考虑到最后的 0。 - fge
22
@fge:实际上需要7个。 - Mat
1
@Dan 编译错误,而不是 - littleadv
11
第三个例子已经编辑过了。 - summerc
另外:https://dev59.com/RXI-5IYBdhLWcg3wYnWQ http://stackoverflow.com/questions/3268292/need-some-help-with-c-programming https://dev59.com/GG865IYBdhLWcg3wWtKz - interjay
4个回答

50

这个链接 应该能够满足您的好奇心。

基本上(忘记了你的第三个例子,它是错误的),1 和 2 的区别在于 1 为数组分配指针的空间。

但是在代码中,您仍然可以像指针一样操作它们——唯一的问题是,您不能重新分配第二个。


各位,在你们收藏 fge 发布的链接之前,请注意 FAQ 网站已经更新为 http://c-faq.com ,而且特定的链接为 http://c-faq.com/aryptr (2.1,2.2),但没有任何更改。以防万一。 - Yannis Dran

49

C中的字符串被表示为字符数组。

char *p = "String";

根据《C程序设计语言第二版》,您正在声明一个指向存储在程序中某处的字符串的指针(修改该字符串是未定义行为)。

char p2[] = "String";

您正在声明一个char类型的数组,并用字符串"String"进行初始化,让编译器来计算数组的大小。

char p3[5] = "String";

你在声明一个大小为5的数组并用"String"进行初始化。这是一个错误,因为"String"无法适配到5个元素。

char p3[7] = "String"; 是正确的声明方式('\0'是c字符串中的终止字符)。

http://c-faq.com/~scs/cclass/notes/sx8.html


请注意,链接已更新为http://c-faq.com/charstring/index.html。 - jwknz

22

你不应该使用第三个,因为它是错误的。"String" 占用7个字节,而不是5个。

第一个是指针(可以重新分配到另一个地址),其他两个被声明为数组,不能被重新分配到不同的内存位置(但它们的内容可能会改变,使用 const 来避免这种情况)。


5
char p3[5] = "String"; 这段代码虽然在 C 语言中是有效的(但在 C++ 中无效),并且不会出错,但是有一定的危险性。 - ouah
6
@ouah - 这是错误的。它可能会通过编译,但它仍然是错误的 - littleadv
4
这是一个对象的严格符合定义。一个严格符合标准的程序在C语言中不会出现错误。 - ouah
6
显眼的运行时错误是不正确的。 - Chris Eberle
10
@Pacerier,请停止故意擅自解读。你很清楚我的陈述并不意味着“使程序无用”。周围的代码并不相关。如果我写入了不应该写入的内存,那是不好的行为。那就是一个 bug。即使没有人注意到,那仍然是一个 bug。即使我的代码从未运行过,仍然存在一个 bug。这个 bug 可能不会运行,但这并不意味着我的代码没有 bug。别再玩文字游戏了,你并不聪明。 - Chris Eberle
显示剩余7条评论

7
char *p = "String";   means pointer to a string type variable.

char p3[7] = "String"; 这句话的意思是你预定义了数组的大小,不超过5个元素。请注意,对于字符串来说,空字符"\0"也被视为一个元素。因此,这个语句会报错,因为元素的数量是7,所以应该这样写:

char p3[7]= "String";

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