我有这段代码
#include <stdio.h>
int main(void)
{
char cad[] = "abc";
char (*ptr)[1];
ptr[0] = cad;
return 0;
}
编译时会抛出这个错误:
error #2168: Operands of '=' have incompatible types 'char [1]' and 'char *'.
为什么会出现此错误?
答案 0 :(得分:3)
为什么会出现此错误?
表达式ptr[0]
的类型为char[1]
,因为ptr
被声明为指向char[1]
类型数组的lika指针
char (*ptr)[1];
表达式cad
的类型为char *
,等于数组cad
的第一个字符的地址。
来自C标准(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
因此在赋值语句的左侧
ptr[0] = cad;
有一个char[1]
类型的数组。在赋值的右侧有一个类型为char *
的指针。这些类型不兼容,并且数组没有赋值运算符。
看来你的意思是以下
#include <stdio.h>
int main(void)
{
char cad[] = "abc";
char * ptr[1];
ptr[0] = cad;
// puts( ptr[0] );
return 0;
}
答案 1 :(得分:1)
为什么会出现此错误( sic )?
char cad[] = "abc";
此处cad
为char[4]
(包含字符'a'
,'b'
,'c'
,'\0'
。)
char (*ptr)[1];
此处,ptr
是指向char[1]
的指针。因此ptr[0]
是char[1]
。
在作业表达式
中 ptr[0] = cad;
cad
衰败到char*
。因此,您最终会得到不兼容的操作数,即LHS上的char[1]
和RHS上的char*
,就像编译器错误消息告诉您的那样。
值得一提的另外两件事:
数组不可分配,因此在ptr[0] = ???;
类型的情况下,没有ptr
有效的分配表达式。
代码中没有指针数组。
答案 2 :(得分:1)
我认为这就是你想要做的事情:
#include <stdio.h>
int main(void)
{
char cad[] = "abc";
int n = sizeof (cad) / sizeof (cad[0]);
char (*ptr)[n];
ptr = &cad;
printf("%s",*ptr);
return 0;
}
输出:
abc
你在做什么的问题是:
char cad[] = "abc";
char (*ptr)[1];
ptr[0] = cad;
char数组cad
有“abc”,类型为char
的指针数组,然后你试图为指针数组(char
)指定一个索引char[]
(即cad
),因此导致类型不匹配。
答案 3 :(得分:0)
编译器的错误消息非常清楚。
ptr
的类型为char (*)[1]
ptr[0]
的类型为char [1]
在cad
中使用时,ptr[0] = cad
会衰减到指针。因此,RHS的类型是char*
。您无法将char*
分配给char [1]
。
另外,
ptr[0] = ...;
导致未定义的行为,因为尚未为ptr
分配内存。
目前还不清楚你想要完成什么。你可以这样做:
char (*ptr)[1] = malloc(sizeof(*ptr));
ptr[0][0] = cad[0];
这会将cad
的第一个字符放在ptr[0][0]
中。但是,ptr[0]
不是以空字符结尾的字符串。因此,您将无法像字符串一样使用它。