第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

二進(jìn)制文件中存儲(chǔ)的int的fread()不成功,出現(xiàn)分段錯(cuò)誤

二進(jìn)制文件中存儲(chǔ)的int的fread()不成功,出現(xiàn)分段錯(cuò)誤

C
慕沐林林 2019-09-27 16:07:01
似乎有大約10個(gè)問(wèn)題,并且(大多數(shù))成功解決了由于C語(yǔ)言中fread()使用不當(dāng)而導(dǎo)致的分段錯(cuò)誤的答案。話(huà)雖如此,我遇到了這樣的問(wèn)題,但沒(méi)有找到解決方案。我有一個(gè)二進(jìn)制文件,其中包含一個(gè)int(稱(chēng)為nbins)和一個(gè)floats(大小為nbins)數(shù)組。當(dāng)我嘗試讀取此文件時(shí),它成功打開(kāi)并指向文件句柄,但在讀取nbins時(shí)卻 出現(xiàn)了分段錯(cuò)誤錯(cuò)誤int。這是一個(gè)最小的示例:#include <stdio.h>#include <stdlib.h>#include <string.h>#define BPATH "/path/to/file"int main(int agrc, char **argv){    FILE *fd;    int num;    char fname[500]={};    int nbins;    float *coords;    num = 5;    sprintf(fname,"%s/file%d.dat", BPATH, num);    if(!(fd=fopen(fname,"rb")))    {        printf("Can't open file: %s\n\n",fname);        exit(0);    }        printf("Reading input file:\n");    printf("%p: %s\n", fd, fname);       // prints successfully    fread(&nbins, sizeof(int), 1, fd);       printf("nbins = %d", nbins);         // seg faults before this print    /* EDIT: the above print isn't properly flushed without an \n         * The seg fault was not caused by the fread(), but the lack of       * the above print lead to the confusion                         */    coords = malloc(nbins * sizeof(float));    fread(coords, sizeof(float), nbins, fd);    fclose(fd);    free(coords);    return(0);}該文件是使用以下格式創(chuàng)建的:int nbins[1];nbins[0] = 5;                          // this 5 is just an example...fwrite(nbins, sizeof(int), 1, file_ptr);fwrite(coords, sizeof(float), nbins[0], file_ptr);我也嘗試過(guò)使用:int *nbins = malloc(sizeof(int));fread(nbins, sizeof(int), 1, fd);但這并不能解決問(wèn)題。該文件確實(shí)存在并且可讀;我可以使用Python和NumPy一起閱讀fromfile()。我是否缺少明顯的東西?謝謝!
查看完整描述

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ì)失敗,并得到NULLcoords

  • 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)。


查看完整回答
反對(duì) 回復(fù) 2019-09-27
?
猛跑小豬

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊

由于我的問(wèn)題在斷言中顯示為不正確,因此我將其作為正確答案(因?yàn)樗赋隽藛?wèn)題所在)。導(dǎo)致賽格故障的實(shí)際誤差不涉及fread()對(duì)的int

查看完整回答
反對(duì) 回復(fù) 2019-09-27
  • 2 回答
  • 0 關(guān)注
  • 711 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)