C:不兼容的类型?

时间:2011-03-02 07:17:16

标签: c types struct char

#include <stdlib.h>
#include <stdio.h>

struct foo{
    int id;
    char *bar;
    char *baz[6];
};

int main(int argc, char **argv){
    struct foo f;   
    f.id=1;

    char *qux[6];

    f.bar=argv[0];
    f.baz=qux;  // Marked line

    return 1;
}

这只是一些测试代码,所以忽略qux实际上没有任何有用的东西。

我在标记的行incompatible types when assigning to type ‘char *[6]’ from type ‘char **’上收到错误,但两个变量在代码中都定义为char *[6]。有什么见解吗?

3 个答案:

答案 0 :(得分:9)

此代码的问题在于

f.baz=qux;

尝试将数组qux分配给数组baz。在C中,数组不是变量,不能分配新值。要查看更简单的示例,请使用以下代码:

int arr1[10], arr2[10];
arr1 = arr2; // Error!

是非法的,因为第二行尝试为第二个数组分配第一个数值,这在C中是不允许的。

要解决此问题,您可能需要编写一个显式循环来复制元素,如下所示:

int i;
for (i = 0; i < 6; ++i)
    f.baz[i] = qux[i];

这是合法的,因为数组的每个元素都是char *,可以分配。

您有时也会看到memcpy用于分配数组:

memcpy(f.baz, qux, sizeof f.baz);

这将复制数组中所有字段的原始字节。

答案 1 :(得分:3)

你不能在C中复制那样的数组。你必须逐个元素地复制它们:

int i;
for (i = 0; i < 6; ++i)
    f.baz[i] = qux[i];

答案 2 :(得分:0)

在C中,您可以直接分配物理内存。您可以指向8,16,32或64位的内存。数组赋值需要以相同的部分完成,以匹配您可以指向的可能部分。

如果需要在不同的时间指向多个这样的数组:

struct foo{
    char **baz;
};

这应该允许你改变所指向的数组:

f.baz=qux;