Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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 - Fatal编程技术网

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
是引用文本的字节长度,包括添加的空终止符。)

这是错误的。该示例没有尝试将as
const char*
分配给
char*
。小错误是字符串文本尽管不可修改,但其类型为
char*
。主要错误是左侧的
没有类型
char*
,它有类型
char[10]
。数组不是指针。在这种情况下,
line
是一个不可修改的左值,但这与此无关,因为无论您在右侧放置什么,它都不能有类型
char[10]
(因为数组在非左值上下文中衰减为指针),因此类型永远无法匹配。这是错误的。该示例没有尝试将as
const 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。请注意,前面的段落,适用于