c - 在 C 中动态分配结构数组

标签 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]);
        }
    }

现在,我觉得我在这里遗漏了一些愚蠢的东西,因为当我调试并尝试访问 size[index].first 和类似性质的东西时,我得到了垃圾内存。我没有正确分配它吗?我写的不正确吗?还是两者兼而有之?

最佳答案

应该是

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

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

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

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

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

关于c - 在 C 中动态分配结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6100435/

相关文章:

arrays - Perl 语法组合 `foreach` 和 `if` : Shouldn't it work, 即 : Why doesn't it work?

c - 堆对齐内存上的 mprotect 神秘地工作

c - STM32 硬故障免费

我们可以在 C 中反转这个字符串吗?

c - xv6 中的 cgaputc(int c)/uartputc(int c)/constputc(int c) 有什么区别?

c++ - 将整数识别为二维数组下标中的 float

c - 如何为多个函数中的结构成员设置特定值?

c - Linux 中的 IPC 编程支持库(使用 C)

可以在嵌套 for 循环中使用双括号吗?

javascript - 附加到对象 - javascript