2012-12-28 49 views
10

我在與Valgrind的一個問題: 這是我的節目(以及在錯誤出現的主要部分):Valgrind的:大小的無效讀出的1

int main() 
{ 
char comanda[N]; 
.... 
char *p; 
while(fgets(comanda,100,stdin)!=NULL) 
    { 
    p=strtok(comanda," \n"); 
    if (strcmp(comanda,"INIT")==0) 
     { 
     p=strtok(NULL," "); 
     Init(n);   
     } 
395 >>if (strcmp(p,"DUMP")==0) 
     { 
     Dump(n);} 
    if (strcmp(p,"ALLOC")==0) 
     { 
     Alloc(j,n); 
     } 
    ....return 0;} 

當我跑Valgrind的,它說:

Invalid read of size 1 
at 0x401569: main (:395) 
Address 0x0 is not stack'd malloc'd or (recently) free'd 

我想不出有什麼用此程序的問題。

+2

在'strtok'之後檢查'p'是否爲NULL。 – DCoder

+0

在調試器下運行程序以確定他們做錯了什麼也可能是一個好主意。 –

+2

此處不需要調試器,valgrind正是在這裏說明發生了什麼。 @ user1934103,請閱讀它告訴你的內容。在它指示的地方,什麼地址可以是'0x0'?所以它告訴你'p'是'0'。 –

回答

5

strtok有可能在沒有剩餘的標記時返回NULL。

當您將NULL傳遞給strcmp時,這是一個未定義的行爲,因爲您在那裏取消了引用NULL。

22

如何閱讀本:

尺寸1

你的程序正試圖從某處讀取一個字節是Valgrind的不喜歡的無效讀取。

在0x401569:主(395)

凡出現這種情況的代碼(顯然STRCMP已經被內聯)

地址0x0不stack'd malloc分配或(最近)free'd

它讀取的地址 - 0x0是「NULL」。聲明的其餘部分只是說它爲什麼無效(它不是來自堆棧,它不是來自malloc,最近也沒有被釋放)。之所以提到「最近」,是因爲valgrind跟蹤釋放的數量有限的釋放內存,所以它不能肯定地說它沒有釋放一百萬次釋放 - 在這種情況下,它不是,但如果你看到這樣的消息,它可能會因爲它在很久以前被釋放而變得無效。地址不會爲零(或接近於零)。