C 字符串声明期间出错
为什么C 字符串声明期间出错,c,string,C,String,为什么 char line[10] = "1234"; 工作很好,但是 char line[10]; line = "1234"; 抛出 error: incompatible types in assignment 错误?第一行工作,因为它使用数据初始化char数组。这与: char line[10] = {'1', '2', '3', '4', '\0'}; 在第二个示例中,“1234”的类型是const char*,因为它是指向常量char数组的指针。您试图将常量char*分配给字
char line[10] = "1234";
工作很好,但是
char line[10];
line = "1234";
抛出
error: incompatible types in assignment
错误?第一行工作,因为它使用数据初始化
char
数组。这与:
char line[10] = {'1', '2', '3', '4', '\0'};
在第二个示例中,
“1234”
的类型是const char*
,因为它是指向常量char
数组的指针。您试图将常量char*
分配给字符*
,这是非法的。将常量(或其他)字符串指定给字符串变量的正确方法是使用strcpy
、strncpy
或任何其他字符串处理函数。第一行工作,因为它使用数据初始化char
数组。这与:
char line[10] = {'1', '2', '3', '4', '\0'};
在第二个示例中,
“1234”
的类型是const char*
,因为它是指向常量char
数组的指针。您试图将常量char*
分配给字符*
,这是非法的。将常量(或其他)字符串指定给字符串变量的正确方法是使用strcpy
,strncpy
,或任何其他字符串处理函数。因为正如其他人所解释的,这些是语言的规则。我会这样写,避免提前声明有多少个字符
const char* line = "1234";
因为正如其他人所解释的,这些是语言的规则。我会这样写,避免提前声明有多少个字符
const char* line = "1234";
数组不是指针。在第二个示例中,
line
是一个不可修改的左值,但更重要的是,无论您在右侧放置什么,它都不能具有类型char[10]
(因为数组在非左值上下文中衰减为指针),因此类型永远无法匹配
值得一提的是,字符串文字的类型是
char[N]
,而不是const char[N]
,尤其不是const char*
,尽管试图修改它会调用未定义的行为。(此处N
是引用文本的字节长度,包括添加的空终止符。)数组不是指针。在第二个示例中,line
是一个不可修改的左值,但更重要的是,无论您在右侧放置什么,它都不能具有类型char[10]
(因为数组在非左值上下文中衰减为指针),因此类型永远无法匹配
值得一提的是,字符串文字的类型是
char[N]
,而不是const char[N]
,尤其不是const char*
,尽管试图修改它会调用未定义的行为。(此处N
是引用文本的字节长度,包括添加的空终止符。)这是错误的。该示例没有尝试将asconst char*
分配给char*
。小错误是字符串文本尽管不可修改,但其类型为char*
。主要错误是左侧的行
没有类型char*
,它有类型char[10]
。数组不是指针。在这种情况下,line
是一个不可修改的左值,但这与此无关,因为无论您在右侧放置什么,它都不能有类型char[10]
(因为数组在非左值上下文中衰减为指针),因此类型永远无法匹配。这是错误的。该示例没有尝试将asconst char*
分配给char*
。小错误是字符串文本尽管不可修改,但其类型为char*
。主要错误是左侧的行
没有类型char*
,它有类型char[10]
。数组不是指针。在这种情况下,line
是一个不可修改的左值,但这与此无关,因为无论您在右侧放置什么,它都不能有类型char[10]
(因为数组在非左值上下文中衰减为指针),因此类型永远无法匹配。从技术上讲,我相信从“类型数组”到“指向类型的指针”也出现在赋值运算符的左侧操作数上,因此两侧可以具有相同的类型;但是,由于左侧操作数不是左值,赋值运算符的约束已被破坏。它不是。衰减“除了赋值的LHS和sizeof
的操作数之外,指针无处不在。C99中的确切文本是:除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,…-其中不包括作业的LHS。请注意,上一段应用于不具有数组类型的左值,明确列出了赋值运算符的LHS,因此在讨论数组时省略了这种情况是值得注意的。因此它会衰减,然后LHS是类型为char*
的非左值表达式?如果是这样的话,那么编译器给出的错误似乎是对代码错误的不正确描述,正确的错误是LHS不是左值。是的,标准似乎非常清楚-这将导致错误,原因与1=2
错误相同。从技术上讲,我相信从“类型数组”到“类型指针”也出现在赋值运算符的左侧操作数上,因此两侧可以具有相同的类型;但是,由于左侧操作数不是左值,赋值运算符的约束已被破坏。它不是“除了赋值的LHS和sizeof
的操作数之外,指针无处不在。C99中的确切文本是:除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,…-其中不包括作业的LHS。请注意,前面的段落,适用于