如何在 C 中声明字符串 [重复]
Posted
技术标签:
【中文标题】如何在 C 中声明字符串 [重复]【英文标题】:How to declare strings in C [duplicate] 【发布时间】:2012-02-02 16:14:25 【问题描述】:谁能解释一下这几行代码有什么区别
char *p = "String";
char p2[] = "String";
char p3[7] = "String";
在什么情况下我应该使用上述的每一个?
【问题讨论】:
最后一个是缓冲区溢出,这很好。 你的第三个例子应该是p3[6]
:你必须考虑最后的0
@fge: 实际上需要 7 个。
@Dan 编译错误,而不是
编辑第三个例子
【参考方案1】:
您不应该使用第三个,因为它是错误的。 “字符串”占用 7 个字节,而不是 5 个。
第一个是指针(可以重新分配到不同的地址),另外两个声明为数组,不能重新分配到不同的内存位置(但它们的内容可能会改变,使用const
来避免这种情况) .
【讨论】:
char p3[5] = "String";
while dangerous 没有错,并且在 C 中有效(但在 C++ 中无效)
@ouah - 这是错误的。它可能通过编译,但仍然错误。
这是一个严格符合对象的定义。就 C 而言,严格遵守的程序并不是“错误的”。
@ouah 公然运行时错误是错误的。
@Pacerier 请停止故意迂腐。你很清楚我的陈述并不意味着“使程序无用”。周围的代码无关紧要。如果我写了我不应该写的内存,那是不好的行为。那是一个错误。即使没有人注意到,这仍然是一个错误。即使我的代码从未运行,仍然存在错误。该错误可能无法运行,但这并不意味着我的代码没有错误。别玩游戏了,你不聪明。【参考方案2】:
This link 应该能满足你的好奇心。
基本上(忘记第三个不好的例子),1 和 2 之间的不同之处在于 1 为指向数组的指针分配空间。
但在代码中,您可以将它们作为指针操作——唯一的问题是,您不能重新分配第二个。
【讨论】:
伙计们,在为 fge 发布的链接添加书签之前,请注意常见问题解答网站已更新为此 c-faq.com 以及发布到此 c-faq.com/aryptr (2.1,2.2) 的特定链接,但没有更改.以防万一。【参考方案3】:char *p = "String"; means pointer to a string type variable.
char p3[5] = "String"
;表示您将数组的大小预定义为不超过 5 个元素。请注意,对于字符串,null "\0" 也被视为一个元素。因此,由于元素的数量为 7,因此该语句会出错,因此应该是:
char p3[7]= "String";
【讨论】:
【参考方案4】:C 中的字符串表示为字符数组。
char *p = "String";
根据 C 编程语言第 2 版,您正在声明一个指向存储在程序中某个位置的字符串的指针(修改此字符串是未定义的行为)。
char p2[] = "String";
您正在声明一个用字符串“String”初始化的 char 数组,让编译器负责计算数组的大小。
char p3[5] = "String";
您正在声明一个大小为 5 的数组并使用“String”对其进行初始化。这是一个错误,因为“字符串”不适合 5 个元素。
char p3[7] = "String";
是正确的声明('\0' 是 c 字符串中的终止字符)。
http://c-faq.com/~scs/cclass/notes/sx8.html
【讨论】:
请注意链接已更新为c-faq.com/charstring/index.html以上是关于如何在 C 中声明字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Typescript 中,如何声明一个返回字符串类型数组的函数?