2 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
在以下情況下,您可能具有未定義的行為:
int nbins;
不初始化nbins
,因此它包含垃圾數(shù)據(jù),可能是非常大的數(shù)字。fread(&nbins, sizeof(int), 1, fd);
未經(jīng)測(cè)試,因此可能會(huì)失敗并保持nbins
未初始化狀態(tài)。了解有關(guān)fread的信息。printf("nbins = %d", nbins);
有沒(méi)有\n
和后面沒(méi)有一個(gè)明確的fflush
,所以不要顯示任何東西(因?yàn)?code>stdout是通常行緩沖)。coords = malloc(nbins * sizeof(float));
將要求大量的內(nèi)存,所以會(huì)失敗,并得到NULL
在coords
fread(coords, sizeof(float), nbins, fd);
NULL
自UB以來(lái)寫(xiě)入指針,給出分段違規(guī)
你很幸運(yùn)。事情可能變得更糟(我們所有人都可能被黑洞摧毀)。你也可以嘗試一些鼻惡魔,甚至更糟的是,有一些執(zhí)行這似乎對(duì)明顯的工作。
下次,請(qǐng)避免UB。我不想消失在黑洞中,所以請(qǐng)忍受。
順便說(shuō)一句,如果您使用GCC,請(qǐng)編譯所有警告和調(diào)試信息:gcc -Wall -Wextra -g
。它會(huì)警告您。如果沒(méi)有,您將在gdb
調(diào)試器下獲得SEGV 。在Linux上,valgrind和strace都可以提供幫助。
請(qǐng)注意,無(wú)用的初始化(例如,在您的情況下為顯式 int nbins = 0;
)在實(shí)踐中不會(huì)有害。如果它們沒(méi)有用(并且當(dāng)它們不是無(wú)用的時(shí)(如您的情況,它們非常快)),則優(yōu)化編譯器可能會(huì)刪除它們。
必讀
拉特納(Lattner)的博客:每個(gè)C程序員應(yīng)了解的UB知識(shí)。相關(guān)概念:假設(shè)規(guī)則。
另請(qǐng)閱讀您正在使用的每個(gè)功能的文檔(甚至與一樣常見(jiàn)printf
)。

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
由于我的問(wèn)題在斷言中顯示為不正確,因此我將其作為正確答案(因?yàn)樗赋隽藛?wèn)題所在)。導(dǎo)致賽格故障的實(shí)際誤差不涉及fread()
對(duì)的int
- 2 回答
- 0 關(guān)注
- 711 瀏覽
添加回答
舉報(bào)