填充结构的数组,在.h中声明,在.c中的函数内部

时间:2017-06-01 23:28:20

标签: c arrays struct header-files

好的,我在我的.h文件中声明了这个结构:

typedef struct Vet32 {
    char key;
    int thrash[7];
} Vet32;

我的另一个.c文件中有一个函数,那不是我的main.c,我想在一行中填充我的数组thrash,如:

vector[i].thrash[] = { 1, 3, 9, 123, 85, 12, 875 };

但是当我尝试像这样填充我的数组时,我总是从我的gcc编译器中得到错误。我使用的功能是:

void createVet(FILE* arq, Vet32 vector[22]) {
    for (int i = 0; i < 22; i++ ) {
        fscanf(arq, "%c", vector[i].key);
        vector[i].thrash[7] = { 1, 3, 9, 123, 85, 12, 875 };
    }
}

阵列的长度总是如此。有人可以帮我这个吗?它真的让我很烦恼C xD中的这些小错误。

2 个答案:

答案 0 :(得分:2)

您只能在声明数组时初始化数组。如果您想稍后填写它们,则需要使用循环或memcpy

void createVet(FILE* arq, Vet32 vector[22]) {
    for (int i = 0; i < 22; i++ ) {
        fscanf(arq, "%c", &(vector[i].key));

        int values[7] = { 1, 3, 9, 123, 85, 12, 875 };
        for (int j = 0; j < 7; j++ ) {
            vector[i].thrash[j] = values[j];
        }
    }
}

使用memcpy代替我之前添加的新for循环,您可以执行此操作:

int values[7] = { 1, 3, 9, 123, 85, 12, 875 };
memcpy(vector[i].thrash, values, sizeof(values));

答案 1 :(得分:1)

这里有初始化的语法。初始化为变量提供其初始值,并且该值必须在编译时保持不变。这是一个重要的要求,因为它允许编译器直接发出值,例如在生成的二进制文件中的数据段中。

但您尝试在作业中使用它。赋值在运行时更改变量的值。

对于的所有版本,不可能分配给数组。因此,最直接的方法就是分配每个成员:

vector[i].thrash[0] = 1;
vector[i].thrash[1] = 3;
[...]

但是既然你使用了struct,还有另外一种方法。 struct可以作为一个整体分配,这可以从开始的复合文字,IIRC完成。以下是一些示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Vet32 {
    char key;
    int thrash[7];
} Vet32;


void initVet(Vet32 *self)
{
    *self = (Vet32) {
        .key = 0,
        .thrash = { 1, 3, 9, 123, 85, 12, 875 }
    };
}

int main(void)
{
    Vet32 vet;
    initVet(&vet);
    for (int i = 0; i < 7; ++i)
    {
        printf("vet[%d] = %d\n", i, vet.thrash[i]);
    }
    return 0;
}

复合文字看起来像初始化,但在parantheses中加上了明确的类型表示法,就像它是一个演员一样。