我有这个代码
#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 *'.
为什么会发生此错误?
为什么会发生此错误?
表达式 ptr[0]
具有类型 char[1]
,因为ptr
被声明为 lika 指向类型为 char[1]
的数组的指针
char (*ptr)[1];
表达式 cad
的类型为 char *
,等于数组 cad
的第一个字符的地址。
来自 C 标准(6.3.2.1 左值、数组和函数指示符(
3 除非是 sizeof 运算符或一元运算符的操作数和 运算符,或者 是用于初始化数组的字符串文本,一个 类型为"类型数组"的表达式将转换为 类型为"指向类型的指针"的表达式,该表达式指向初始 元素,并且不是左值。如果数组对象 具有寄存器存储类,行为未定义。
因此在赋值语句的左侧
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;
}
我认为这就是您要做的:
#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
(的单个索引,从而导致类型不匹配。
为什么会发生此错误(原文如此(?
char cad[] = "abc";
这里,cad
是一个char[4]
(包含字符'a'
、'b'
、'c'
、' '
。
char (*ptr)[1];
在这里,ptr
是指向char[1]
的指针。所以ptr[0]
是一个char[1]
.
在赋值表达式中
ptr[0] = cad;
cad
衰变到char*
.因此,您最终会得到不兼容的操作数,即 LHS 上的操作数char[1]
和 RHS 上的操作数char*
,就像编译器错误消息告诉您的那样。
还有两件事值得一提:
数组不可赋值,因此在给定
ptr
的类型下,没有ptr[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]
不是以空结尾的字符串。因此,您将无法像字符串一样使用它。