c++ - 这五种不同的 cString 声明方式是怎么回事?

标签 c++ c string char

另一个问题(我现在找不到)的解释是 "string"and {'s','t','r','i','n','g','\0' } 是等价的。事实上,下面的前四个声明都编译并且似乎做同样的事情。但是为什么第五个声明不能编译呢?看起来它们毕竟不是等价的。所以我的问题是,四个正确的和一个不正确的 cstring 声明到底是怎么回事?

int main()
{
    char cString1[]="string";

    char * cString2 = "string";

    char cString3[] = {'s','t','r','i','n','g', '\0'};

    char cString4[7] = {'s','t','r','i','n','g','\0'};

    char * cString5 = {'s','t','r','i','n','g','\0'};


    return 0;
}

最佳答案

声明并不完全相同:第一个、第三个和第四个声明创建字符串文字的可写拷贝,而第二个声明不创建拷贝。结果,这样的赋值是合法的

cString1[0] = 'S'; // cString3 and cString4 would work as well

尝试对 cString2 执行相同操作会触发未定义的行为。

第三和第四个声明是相同的,除了第三个让编译器计算出数组的大小,而第四个明确指定它。你可以像这样重写第一个声明

char cString1a[7]="string";

遵循相同的模式。

虽然"string"可以重写为{'s','t','r','i','n','g','\0' } 在数组声明中,在初始化指针的上下文中是不合法的。这就是最后一个声明不起作用的原因。

但是,在 c99 中,您可以使用复合文字 重写它以使其工作 (demo):

char * cString5 = (char[]){'s','t','r','i','n','g','\0'};

关于c++ - 这五种不同的 cString 声明方式是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615859/

相关文章:

c - 使用 fcntl.h close 无法正确关闭文件

python - 如何找出当前系统首选语言是什么

c# - 如何将字符串添加到资源?

javascript - 如何识别字符串中的第一个字符是否是Javascript中的数字

c++ - 以编程方式检查头文件是否存在的最佳方法?

c++ - 在多线程应用程序中使用 opencv waitKey()

c++ - 我如何强制启动板使用 g++ 4.7 或更高版本构建我的包

c++ - 为简单的 src、include、libs 文件夹项目编写 Makefile

c - C中的结构内结构

asp.net - 将配置设置从 web.config 移至 ServiceConfiguration.cscfg