2015-07-04 111 views
1

因此,我試圖從.s19文件中加載s-records到內存中,用於我正在處理的任務及其工作。然而,當我從我的代碼中刪除一個未使用的數組時,一切都停止工作並崩潰。刪除未使用的變量會導致代碼崩潰

未使用數組是:

char test[65536]; 

這是我寫的裝載機:

void loader(FILE * srec) 
{ 
    char instring[SREC_LEN]; 
    char test[65536]; // This isn't used, but the program crashes without it for some reason 
    int i=0; 
    int j=0, k,l; 
    while (fgets(instring, SREC_LEN, srec) != NULL) 
    { 

     while(instring[i] != '\n') // Counts the characters in the s-record 
     { 
      i++; 

     } 
     j = j+i; 
     for(k=0;k<=i;k++) // Puts the records into memory 
     { 
      memory[l] = instring[k]; 
      l++; 
     } 
     l = j; 

    } 
    #ifdef DEBUG 
    printf("MEMORY: %s",memory); 
    #endif // DEBUG 
} 

如果你能幫助我瞭解爲什麼發生這種情況,我將不勝感激。

+1

似乎未定義的行爲案例。什麼是「記憶」? – haccks

+3

'l'未初始化。和'我'需要重置。 – BLUEPIXY

回答

1

你的代碼是未定義行爲,它只能僥倖:

fgets()可能會返回而不需要編寫一個換行符到緩衝區,如果達到EOF過早。所以你至少應該在你的循環中考慮這一點。你也永遠不會重置i爲0,你應該。更改此:

while(instring[i] != '\n') // Counts the characters in the s-record 
    { 
     i++; 

    } 

到:

i = 0; 
    while(instring[i] != '\n' && instring[i] != '\0') // Counts the characters in the s-record 
    { 
     i++; 

    } 

l永遠不會初始化;你可能寫出了memory的界限。初始化l以0:

int j = 0, k, l = 0; 

(我假設memory是大到足以容納一切)。

它在我看來也像你想for(k = 0; k < i; k++)而不是for(k = 0; k <= i; k++),因爲i是你想複製的字符數。

您可能想用memcpy()代替。

+0

謝謝,現在完美! – Cody

+0

@Cody很高興能幫到你。像這樣的奇怪問題(「當我刪除這個變量,代碼崩潰」)通常意味着其他的東西是錯誤的,並且在某處存在UB。 –