2015-07-04 3 views
1

Так что я пытаюсь загрузить s-записи из файла .s19 в память для задания, над которым я работаю, и его работы. Однако, когда я удаляю неиспользуемый массив из своего кода, все перестает работать и падает.Удаление неиспользуемой переменной приводит к сбою кода

Неиспользованный массив:

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' неинициализирован. и 'i' необходимо выполнить сброс. – 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 Glad Я мог бы помочь. Такие странные проблемы, как это («когда я удаляю эту переменную, сбой кода») обычно означают, что что-то еще не так и что где-то есть UB. –

Смежные вопросы