2011-03-02 114 views
0
#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实际上没有任何有用的东西。C:不兼容的类型?

我在标记行上发现一个错误,incompatible types when assigning to type ‘char *[6]’ from type ‘char **’但在代码中将这两个变量定义为char *[6]。任何见解?

+0

' char * baz [6];'声明一个由6个指针组成的数组。如果你想声明一个指向数组的指针,写'char(* baz)[6];' – pmg 2011-03-02 09:09:44

回答

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); 

此副本在阵列中的所有字段的原始字节。

3

您不能复制数组一样,在C.你必须将它们复制元素的元素:

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

在C语言中,你直接做任务到物理内存。您可以在8,16,32或64位指向内存。数组分配需要以与您可指向的可能部分相匹配的部分完成。

如果有必要指出在不同时间的多个这样的数组,你可以这样做:

struct foo{ 
    char **baz; 
}; 

这应该允许您更改数组被指向为你做:

f.baz=qux;