指向数组的指针出错

时间:2016-05-16 16:49:08

标签: c arrays pointers declaration

我有这段代码

#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 *'.

为什么会出现此错误?

4 个答案:

答案 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";

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