无法给结构体中一个变量赋值,何解?

我利用fprintf从一个txt文件中读取一段信息,将其分割后存储在结构体中,但是有一个int类型的变量一直无法赋值。
起初以为是多次间接访问的问题,于是用另一个指针指向它,依然无法赋值。
后来,换成*(&scoreLe),依然无法赋值。
怀疑是IDE的问题,重启IDE,依然无法赋值。
在单步调试中,发现并执行student->scoreLen=scoreLe;后内存中依然没有变化
图片描述

然而,当我在VS2017的命令窗口里,输入这一句并执行后,内存发生了变化。语句是没有问题的,但为何在程序执行中却不能赋值?
图片描述

完整代码在https://github.com/CZM1998/St...
问题代码在link.c 641行

回答:

我把你的大作业都看了遍, 发现有一个问题:
LIST结构体里面的head是一个STUDENT *, 而你整个项目都没有对head进行过malloc, 所以直接对head进行->解引用操作是undefined behavior.

  • 这种指针也叫Dangling pointer(悬挂指针).

而你这里的student正是newList->head, 所以"无法给结构体中一个变量赋值"是很正常的, 因为已经是undefined behavior, 所以不是正常的代码, 产生任何结果都是合理的.

  • 这种错误叫segmentfault, 也正是本站的名字, 意思是access了不应该被访问的内存区域(原因前面讲过了, 是悬吊指针, 所以可能指向某些难以言状的内存地址) : )

解决途径: createNewList函数里面增加newList->head = malloc(sizeof STUDENT);

PS: 小小的codereview, 在c语言中, malloc不要在前面显式cast, 这是多余的, 也会掩盖你未include某些关键头文件的错误. c++则必须cast, 因为c++不允许void*(malloc的返回类型)隐式转换到任意指针.

PPS: 写纯c不要用vs, vs的c标准是非常残废的, 用clion或者codeblocks吧.

回答:

链接打开看不到代码

以上是 无法给结构体中一个变量赋值,何解? 的全部内容, 来源链接: utcz.com/p/194614.html

回到顶部