C:不兼容的类型?
问题描述:
#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]
。任何见解?
答
与此代码的问题是,所述线
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);
此副本在阵列中的所有字段的原始字节。
答
您不能复制数组一样,在C.你必须将它们复制元素的元素:
int i;
for (i = 0; i < 6; ++i)
f.baz[i] = qux[i];
答
在C语言中,你直接做任务到物理内存。您可以在8,16,32或64位指向内存。数组分配需要以与您可指向的可能部分相匹配的部分完成。
如果有必要指出在不同时间的多个这样的数组,你可以这样做:
struct foo{
char **baz;
};
这应该允许您更改数组被指向为你做:
f.baz=qux;
' char * baz [6];'声明一个由6个指针组成的数组。如果你想声明一个指向数组的指针,写'char(* baz)[6];' – pmg 2011-03-02 09:09:44