2015-11-19 3 views
-3

После компиляции данной программы с помощью gcc-компилятора я попытался запустить эту программу на моей машине ubuntu, но вместо этого получил сообщение об ошибке: Ошибка сегментации (сбрасывание ядра), однако, когда я компилировать/запускать ту же программу на devC++ на моей машине с Windows, она работает отлично. Любая идея, пожалуйста?Ошибка сегментации (core dumped) на ubuntu32bit

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int bof(char *str) 
{ 
    char buffer [24]; 
    strcpy(buffer , str); 
    return 1; 
} 

int main (int argc , char **argv) 
{ 
    char str[517]; 
    FILE *badfile ; 
    badfile = fopen (" badfile ", "r"); 
    fread(str , sizeof(char), 517, badfile); 
    bof(str); 
    printf(" Returned properly \n"); 
    return 1; 
} 
+0

Неопределенное поведение - может работать, может произойти сбой, может уничтожить Вселенную – qrdl

ответ

3

Вы копируя из str, который может быть до 517 байт в размере до buffer, который составляет всего 24 байт.

Итак, если строка, которую вы читаете, длиннее 24 байтов, вы копируете в конец buffer в память, которая не принадлежит ей. То есть undefined behavior, что означает, что программа может потерпеть крах, может показаться, что она работает нормально, или может отображать другое, казалось бы, случайное поведение.

Вы должны убедиться, что вы не перезаписывать границы вашего массива:

// first zero out the buffer, since strncpy doesn't necessarily NULL terminate 
memset(buffer, 0 sizeof(buffer)); 
strncpy(buffer, str, sizeof(buffer) - 1); 

EDIT:

Как iharob, упоминалось, данные считываются в из файла не является NULL так что вызов strcpy мог прочитать с конца str. Таким образом, вы должны обратиться к этому, а также:

int main (int argc , char **argv) 
{ 
    char str[517]; 
    FILE *badfile ; 
    badfile = fopen ("badfile", "r"); 
    if (!badfile) { 
     perror("fopen failed"); 
     exit(1); 
    } 
    // read in 1 byte less than the buffer size, and capture the return value 
    int len = fread(str , sizeof(char), sizeof(str)-1, badfile); 
    if (len == -1) { 
     perror("fread failed"); 
     fclose(badfile);  // don't forget to close on error 
     exit(1); 
    } else { 
     // add the NULL terminator 
     str[len]='\0'; 
    } 
    bof(str); 
    printf(" Returned properly \n"); 
    fclose(badfile);  // don't forget to close 
    return 1; 
} 
+0

я изменил размер буфера 517, до сих пор я получаю то же сообщение об ошибке – sasuke

+0

@sasuke Там нет места для завершения байт 'nul', обратите внимание, что это очень своеобразное число' 517', откуда оно взялось? Если это количество символов в файле, вы должны сделать буфер '518' для хранения терминатора' '\ 0'' и добавить его как' str [517] = '\ 0'' в противном случае 'strcpy () 'приведет к неопределенному поведению и, следовательно, может привести к сбою. –

+0

Огромное спасибо ребятам :) – sasuke

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