在C中为数组分配一个数组

时间:2014-02-23 20:13:32

标签: c arrays pointers

我写了这段代码

#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]。

我知道数组名称会在表达式中衰减成指针,但有没有办法抑制它,因为我需要一个数组?

5 个答案:

答案 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必须足够大,否则会导致未定义的行为甚至是段错误。