#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]
。有什么见解吗?
答案 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;