C语言 指向数组的指针出错



我有这个代码

#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]
cadptr[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]不是以空结尾的字符串。因此,您将无法像字符串一样使用它。

最新更新