2015-04-01 30 views
0

我首先讀取二進制文件,當我讀取文件結尾時,文件關閉,視覺stdio 2013錯誤指針超過了邊界。當文件指針讀取文件的邊界?

FILE *fp; 
fp = fopen("stu_manage.txt", "ab+"); 
fseek(fp,0L,SEEK_END); 
long last = ftell(fp)/length; 
long i = 0L; 
rewind(fp); 
struct student *node=(struct student*)malloc(sizeof(struct student)); 
for (; i < last; i++) 
{ 
    if (fread(&node[i], length, 1, fp) != 1) 
    { 
     printf("read conpletely"); 
     break; 
    } 
} 
if (fp!=NULL) 
    fclose(fp); 

當我把這裏的指針變化爲全局變量,這個錯誤就解決了,相當於指針在一定程度上陣列這裏無法運行,我覺得無法理解。

+3

標準警告:請[不要轉換](http://stackoverflow.com/q/605845/2173917)'malloc()'和'C'中的系列的返回值。 – 2015-04-01 09:07:09

+1

什麼是「長度」?它的定義在哪裏? – niyasc 2015-04-01 09:11:14

+1

@SouravGhosh:總而言之,您不會隨時拋出'malloc()'的返回值,因爲:C中的 不是必需的; 在C++中它將是必需的,但在C++中,你甚至不使用'malloc()';) – dhein 2015-04-01 09:15:46

回答

3

在代碼中,你只有一個在nodestruct student類型的變量分配內存,但你使用增量指標i

if (fread(&node[i], length, 1, fp) != 1) 

這在訪問超出限制的內存輪到調用undefined behaviour

0

我認爲這個問題是在該行

if (fread(&node[i], length, 1, fp) != 1) 

因爲FREAD將返回> 0的值時,它是成功的。如果struct student的大小大於1,則在讀取第一個節點之後,循環會中斷。並且它不會讀取其餘節點

相關問題