好的,我在我的.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中的这些小错误。
答案 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)
这里有初始化的语法。初始化为变量提供其初始值,并且该值必须在编译时保持不变。这是一个重要的要求,因为它允许编译器直接发出值,例如在生成的二进制文件中的数据段中。
但您尝试在作业中使用它。赋值在运行时更改变量的值。
对于c的所有版本,不可能分配给数组。因此,最直接的方法就是分配每个成员:
vector[i].thrash[0] = 1;
vector[i].thrash[1] = 3;
[...]
但是既然你使用了struct
,还有另外一种方法。 struct
可以作为一个整体分配,这可以从c99开始的复合文字,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中加上了明确的类型表示法,就像它是一个演员一样。