在C中动态分配结构数组

在C中动态分配结构数组,c,arrays,malloc,struct,C,Arrays,Malloc,Struct,我正在为CS1做一个家庭作业,如果我们忘记了一些C(主要是关于指针和内存分配)的话,它应该会让我们恢复速度。我已经做了15个多小时了,我需要一些认真的帮助 这个问题告诉我们按如下方式使用结构: typedef struct LottoPlayer { char first[20]; char last[20]; int nums[6]; } KBLP; 我们应该读取一个文件并为这些结构的数组动态分配内存,然后我们可以使用这些信息来选择winner

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

这个问题告诉我们按如下方式使用结构:

typedef struct LottoPlayer {
        char first[20];
        char last[20];
        int nums[6];
} KBLP;
我们应该读取一个文件并为这些结构的数组动态分配内存,然后我们可以使用这些信息来选择winners 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]);
        }
    }
int索引;
int i;
对于(index=0;index因为(i=0;i我想到两件事:

  • fscanf(infle,“%d”,size[index].nums[i])
    size[…
    之前缺少一个
    &
    。是否确实在没有警告的情况下编译了此文件

  • fscanf(…,“%s”,size[index].last)
    可以覆盖字符串中超过19个字符的内容(请记住,终止符需要额外的字符)。打印字符串以确保长度正确


    • 我想到两件事:

      • fscanf(infle,“%d”,size[index].nums[i])
        size[…
        之前缺少一个
        &
        。是否确实在没有警告的情况下编译了此文件

      • fscanf(…,“%s”,size[index].last)
        可以覆盖字符串中超过19个字符的内容(请记住,终止符需要额外的字符)。打印字符串以确保长度正确


      第一次和最后一次填充正常,但您在nums中得到垃圾


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

      第一次和最后一次填充是确定的,但您在nums中得到垃圾

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

      它应该是

      fscanf(infile, "%d", &size[index].nums[i]);
      
      注意第二个参数中的
      &
      运算符。当然,@missingno的答案中表达的关注点也是有效的

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

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

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

      fscanf(infile, "%d", &size[index].nums[i]);
      
      注意第二个参数中的
      &
      运算符。当然,@missingno的答案中表达的关注点也是有效的

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

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

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

      尝试使用安全/安全函数(不允许缓冲区溢出的函数)读取字符串。.函数fgets()获取缓冲区的长度作为参数,以便此函数读取的字符数不会超过缓冲区可以容纳的字符数。尝试使用安全/安全函数(不允许缓冲区溢出的函数)要读取字符串,函数fgets()将缓冲区的长度作为参数获取,以便此函数读取的字符数不会超过缓冲区所能容纳的字符数。