我写了这段代码
#include <stdio.h>
struct foo
{
int foo1[3];
};
int main(void)
{
int a[] = {1, 2, 3};
struct foo test;
test.foo1 = a;
printf("%d\n", test.foo1[0]);
return 0;
}
它给出了编译错误,说它无法将int *转换为int [3]。
我知道数组名称会在表达式中衰减成指针,但有没有办法抑制它,因为我需要一个数组?
答案 0 :(得分:3)
正如其他人所说,没有直接赋值运算符会复制数组。你必须使用memcpy()代替
memcpy(test.foo1, a, sizeof(a));
这是C中的一个错误来源,因为sizeof()需要足够大才能复制所有数据但不能太大,以免在tests.foo1上覆盖数据。我想,最好的做法是在执行memcpy()之前测试两个数组的大小是否相同。
答案 1 :(得分:1)
这是C的基础之一,无法分配数组。
答案 2 :(得分:0)
在C和C ++中,无法为整个数组赋值。也无法为数组分配另一个数组的值(即使维度匹配)。
答案 3 :(得分:0)
您无法在C中分配数组。但是,您可以分配用户定义类型的对象,即使这些对象包含数组也是如此。所以peraps就像这样重写:
struct foo a = { { 1, 2, 3 } };
struct foo test;
test = a;
或者当然只是立即正确初始化对象:
struct foo test = { { 1, 2, 3 } };
答案 4 :(得分:0)
数组不是C
中的第一类对象。您无法复制(分配),比较,传递或返回数组。您可以按元素将数组复制到另一个数组元素中。您还要逐个元素地比较两个数组。您将指针传递给数组的第一个元素,并类似地返回指向动态分配的数组的第一个元素的指针。因此test.foo1 = a;
是错误的。你有两个选择。
#include <stdio.h>
struct foo {
int foo1[3];
};
int main(void) {
int a[] = {1, 2, 3};
struct foo test;
int len = *(&(test.foo1) + 1) - test.foo1; // length of the array test.foo1
int i = 0;
for(i = 0; i < len; i++)
test.foo1[i] = a[i]; // copy the array element-wise
printf("%d\n", test.foo1[0]);
return 0;
}
您还可以使用a
直接将main
中数组test.foo1
中的所有字节复制到数组memcpy
。
memcpy(test.foo1, a, sizeof a);
这会将数组a
的所有字节复制到数组test.foo1
中。因此,数组test.foo1
必须足够大,否则会导致未定义的行为甚至是段错误。