2017-08-01 80 views
1

我試過了這種循環的各種排列。如何將char *複製到靜態字符串數組中,printf產生奇怪的輸出,

char hrstdesc[50][50]; 
char hrstread[50][50]; 
int i = 0; 

for (hfree = hentry; hfree; hfree = hfree->prev) { 
    if (filterentry(hfree)) { 
     continue; 
    } 

    strcpy(&hrstdesc[i][0], hfree->hrstdesc); 
    printf("%s \n", hrstdesc[i]); 
    i++; 
} 
printf("%s \n", hrstdesc[1]); 

的輸出,

/run/media/username/archive 
/home 
/var 
/
/ho/va/ 

第4行來自何方,printf("%s \n", srtdesc);,並且是我的期望。

最後一行,我期望看到/home,但我得到/ho/va/

https://github.com/techzilla/check_snmp_extras/blob/master/src/check_snmp_disks.c

+2

for(hentry = hentry;)??? –

+0

'hentry = hentry'你爲什麼要這麼做? – babon

+0

@babon,請糾正我,我會非常感激。我只是認爲這是你在循環這個結構時應該做的事情。我對更好的練習很感興趣。 我見過一些人做了一個臨時變量,運行這樣一個循環,但不知道爲什麼。有點像'for(hfree = hentry; hfree; hfree = hfree-> prev){' – TechZilla

回答

1

在您鏈接的文件,你定義hrstdesc [] []爲hrstdesc [MAX_ENTRIES] [MAX_ENTRIES](不是[50] [50])。 MAX_ENTRIES在同一個repo中可用的check_snmp_extras.h頭文件中被定義爲3。

奇怪的行爲是由於每個循環迭代中的hrstdesc [] []溢出引起的。您的最終hrstdesc [1]是循環迭代1(/ home)的前3個字符,後面是循環迭代2的前3個字符(/ var),後面是循環迭代3中的一個字符(/ )。

+0

我很驚訝你沒有得到某種分段錯誤或核心轉儲等由於內存損壞... – lyst

相關問題