为什么在不可变的字符集可能的情况下没有不可变的整数集?

时间:2015-03-08 06:36:00

标签: c string pointers char integer

char *str = "Hey baby";

为字符串创建内存并将str指向它。如果这是有效的,为什么不是以下:

int *x = {7, 0, 1};

这应该是相同的,除了int而不是char s。

2 个答案:

答案 0 :(得分:13)

有“不可变的一组整体”,它看起来像:

(const int[]){7, 0, 1}

正确的术语是复合文字。你可以指出它:

const int *ptr = (const int[]){7, 0, 1};

由于历史原因,尽管字符串文字是不可变的,但它没有const类型。但是最好使用const char *指向它们,以便编译器在您尝试写入时检测它们。

具有const类型的复合文字可以与字符串文字相同的方式“折叠”,即它们可能与其他此类复合文字重叠。非const复合文字确实有唯一的地址,可以写入。

答案 1 :(得分:0)

  

为什么在不可变的字符集可能的情况下不能使用一组不可变的整数?

原因是声明如

int *x = {7, 0, 1};  

是违反约束的行为。这取决于编译器如何处理它。

5.1.1.3诊断(P1):

  

如果预处理转换单元或转换单元包含违反任何语法规则或约束的情况,则符合要求的实现应生成至少一条诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实施定义的

在大多数情况下,如果不使用-pedantic -Wall -Wextra标志进行编译,编译器不会发出任何警告。针对此格式错误的初始化报告bug in GCC

使用int限定符

可以创建不可变的const集合
int const x[] = {7, 0, 1};