我正在为CS1做一个家庭作业,如果我们忘记了一些C(它主要是关于指针和内存分配),它应该让我们恢复速度.我已经工作了超过15个小时,我需要一些认真的帮助.
问题告诉我们使用如下结构:
typedef struct LottoPlayer {
char first[20];
char last[20];
int nums[6];
} KBLP;
Run Code Online (Sandbox Code Playgroud)
我们应该读取一个文件并为这些结构的数组动态分配内存,然后我们可以使用该信息来选择获胜者yada yada.每当我运行我的代码时,我都会一直收回垃圾邮件.所以这就是我所拥有的,我认为问题是我的指针算法或我设置malloc的方式.
int main() {
//Code to open the files
int NumTickets;
fscanf(infile, "%d", &NumTickets);
KBLP *size=malloc(NumTickets*sizeof(KBLP));
Run Code Online (Sandbox Code Playgroud)
然后,当我正在读取文件并将其写入数组时,我会这样做
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我觉得我在这里失去了一些愚蠢,因为当我调试并尝试访问大小[index] .first和那种性质的东西时,我得到了垃圾记忆.我没有正确分配它吗?我没有正确地写信吗?或两者?
它应该是
fscanf(infile, "%d", &size[index].nums[i]);
Run Code Online (Sandbox Code Playgroud)
请注意&
第二个参数中的运算符.当然,@ missingno的回答中表达的担忧也是有效的.
scanf
组中的函数将指针作为每个数据接收者的参数.您有责任在&
必要时应用操作员.编译器通常无法验证您是否传递了正确类型的值,因为这些函数的尾随参数是可变参数,即它们没有预定类型.但是,一些编译器(如GCC)会努力执行检查,这意味着您的代码会针对上述问题触发GCC编译器的警告.
请注意,当您传递数组类型的参数时,数组类型会自动"衰减"到指针类型,这就是fscanf
代码中前两个不需要&
运算符的原因.然而,如果你愿意,你可以将这些改写fscanf
为
fscanf(infile, "%s", &size[index].last[0]);
fscanf(infile, "%s", &size[index].first[0]);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3876 次 |
最近记录: |