在C中动态分配结构数组

时间:2011-05-23 16:59:44

标签: c arrays malloc struct

我正在为CS1做一个家庭作业,如果我们忘记了一些C(它主要是关于指针和内存分配),它应该让我们恢复速度。我已经工作了超过15个小时,我需要一些认真的帮助。

问题告诉我们使用结构如下:

typedef struct LottoPlayer {
        char first[20];
        char last[20];
        int nums[6];
} KBLP;

我们应该读取一个文件并为这些结构的数组动态分配内存,然后我们可以使用该信息来选择获胜者yada yada。每当我运行我的代码时,我都会一直收回垃圾邮件。所以这就是我所拥有的,我认为问题是我的指针算法或我设置malloc的方式。

int main() {
    //Code to open the files

    int NumTickets;
    fscanf(infile, "%d", &NumTickets);
    KBLP *size=malloc(NumTickets*sizeof(KBLP));

然后,当我正在读取文件并将其写入数组时,我会

    int index; 
    int i;
    for (index=0; index < NumTickets; index++) { 
        fscanf(infile, "%s", size[index].last);
        fscanf(infile, "%s", size[index].first);
        for (i=0; i<6; i++) {
            fscanf(infile, "%d", size[index].nums[i]);
        }
    }

现在,我觉得我在这里失去了一些愚蠢,因为当我调试并尝试访问大小[index] .first和那种性质的东西时,我得到了垃圾记忆。我没有正确分配它吗?我没有正确地写信吗?或两者兼而有之?

3 个答案:

答案 0 :(得分:7)

应该是

fscanf(infile, "%d", &size[index].nums[i]);

请注意第二个参数中的&运算符。当然,@ missingno的答案中表达的担忧也是有效的。

scanf组中的函数期望指针作为每个数据收件人的参数。您有责任在必要时应用&运算符。编译器通常无法验证您是否传递了正确类型的值,因为这些函数的尾随参数是 variadic ,即它们没有预定类型。但是,一些编译器(如GCC)会努力执行检查,这意味着您的代码会针对上述问题触发GCC编译器的警告。

请注意,当您传递数组类型的参数时,数组类型会自动“衰减”为指针类型,这就是代码中前两个fscanf不需要应用&运算符的原因。但是,如果您愿意,可以将这些fscanf重写为

fscanf(infile, "%s", &size[index].last[0]);
fscanf(infile, "%s", &size[index].first[0]);

答案 1 :(得分:4)

我想到了两件事:

  • fscanf(infile, "%d", size[index].nums[i])&之前缺少size[...。你确定编译时没有警告吗?

  • 如果您的字符串超过 19 字符,fscanf(..., "%s", size[index].last)可以覆盖内容(请记住您需要为终结符添加额外的字符)。打印字符串以确保它们具有正确的长度。

答案 2 :(得分:4)

第一次也是最后一次填充确定但是你在nums中得到了垃圾?

提示:fscanf(“%d”....)将要填充整数字段。为此,它需要一个指针。你在给它什么?