如何在 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 中,如何声明一个返回字符串类型数组的函数?

如何在 C 中安全地声明 16 位字符串文字?

Visual Studio C++字符串比较没有声明[重复]

C#编组来自C++ DLL的无符号字符返回值[重复]

如何连接静态字符串数组[重复]

在 C++/CLI 中,如何声明和调用带有“out”参数的函数?