Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不可能有不变的整数集而有不变的字符集?_C_String_Pointers_Char_Integer - Fatal编程技术网

C 为什么不可能有不变的整数集而有不变的字符集?

C 为什么不可能有不变的整数集而有不变的字符集?,c,string,pointers,char,integer,C,String,Pointers,Char,Integer,为字符串创建内存并将str指向该字符串。如果这是有效的,为什么不采取以下措施: char *str = "Hey baby"; 除了它们是ints而不是chars之外,这应该是相同的。有一个“不可变的int集”,它看起来像: int *x = {7, 0, 1}; 正确的术语是复合文字。您可以指向它: (const int[]){7, 0, 1} 由于历史原因,字符串文字不具有const类型,尽管它是不可变的。但是最好使用constchar*来指向它们,这样编译器就可以在您尝试写入时检测到

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

char *str = "Hey baby";
除了它们是
int
s而不是
char
s之外,这应该是相同的。有一个“不可变的int集”,它看起来像:

int *x = {7, 0, 1};
正确的术语是复合文字。您可以指向它:

(const int[]){7, 0, 1}
由于历史原因,字符串文字不具有
const
类型,尽管它是不可变的。但是最好使用
constchar*
来指向它们,这样编译器就可以在您尝试写入时检测到它们

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

为什么不可能有不变的整数集而有不变的字符集

原因是这些声明

const int *ptr = (const int[]){7, 0, 1};
是违反约束的行为。这取决于编译器如何处理这个问题

5.1.1.3诊断(P1): 如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,即使行为也明确指定为未定义或实现定义,一致性实现应产生至少一条诊断消息(以实现定义的方式识别)

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

使用
const
限定符可以创建一组不可变的
int

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

你可以这样做:intx[]={7,0,1};但是x是可变的。而且,
str
应该是:const char*str=“Hey baby”;因为C标准对字符串文字进行了特殊处理,因为它们非常常见和有用,但对于一般数组文字却不存在这样的概念;其他人都会猜测。虽然对于一种语言的新手来说,并不总是很清楚是设计师的突发奇想让事情变得如此,所以这些问题对于区分“它很神秘,但这就是为什么”和“没有人知道,也没有办法”是很有价值的;是合法的,不会有nul终止符,而:char str[6]=“Hello”;也是合法的,但会有一个nul终结者。这很漂亮。这是什么时候添加到C的?@MattMcNabb对不起,我的问题是关于c90 std的,这仍然成立吗?@tomol这在c90中是不可能的
int const x[] = {7, 0, 1};