鍍金池/ 問答/C  HTML/ 無法給結(jié)構(gòu)體中一個變量賦值,何解?

無法給結(jié)構(gòu)體中一個變量賦值,何解?

我利用fprintf從一個txt文件中讀取一段信息,將其分割后存儲在結(jié)構(gòu)體中,但是有一個int類型的變量一直無法賦值。
起初以為是多次間接訪問的問題,于是用另一個指針指向它,依然無法賦值。
后來,換成*(&scoreLe),依然無法賦值。
懷疑是IDE的問題,重啟IDE,依然無法賦值。
在單步調(diào)試中,發(fā)現(xiàn)并執(zhí)行student->scoreLen=scoreLe;后內(nèi)存中依然沒有變化
圖片描述

然而,當(dāng)我在VS2017的命令窗口里,輸入這一句并執(zhí)行后,內(nèi)存發(fā)生了變化。語句是沒有問題的,但為何在程序執(zhí)行中卻不能賦值?
圖片描述

完整代碼在https://github.com/CZM1998/St...
問題代碼在link.c 641行

回答
編輯回答
情未了

我把你的大作業(yè)都看了遍, 發(fā)現(xiàn)有一個問題:
LIST結(jié)構(gòu)體里面的head是一個STUDENT *, 而你整個項目都沒有對head進(jìn)行過malloc, 所以直接對head進(jìn)行->解引用操作是undefined behavior.

  • 這種指針也叫Dangling pointer(懸掛指針).

而你這里的student正是newList->head, 所以"無法給結(jié)構(gòu)體中一個變量賦值"是很正常的, 因為已經(jīng)是undefined behavior, 所以不是正常的代碼, 產(chǎn)生任何結(jié)果都是合理的.

  • 這種錯誤叫segmentfault, 也正是本站的名字, 意思是access了不應(yīng)該被訪問的內(nèi)存區(qū)域(原因前面講過了, 是懸吊指針, 所以可能指向某些難以言狀的內(nèi)存地址) : )

解決途徑: createNewList函數(shù)里面增加newList->head = malloc(sizeof STUDENT);

PS: 小小的codereview, 在c語言中, malloc不要在前面顯式cast, 這是多余的, 也會掩蓋你未include某些關(guān)鍵頭文件的錯誤. c++則必須cast, 因為c++不允許void*(malloc的返回類型)隱式轉(zhuǎn)換到任意指針.

PPS: 寫純c不要用vs, vs的c標(biāo)準(zhǔn)是非常殘廢的, 用clion或者codeblocks吧.

2017年12月19日 10:06
編輯回答
拽很帥

鏈接打開看不到代碼

2017年5月25日 05:19