2013-02-01 95 views
1

我有一些代碼,我用普通的C編寫的問題。 它在Windows上工作正常,但在Ubuntu上有一個錯誤說「分段錯誤(核心轉儲)」 。我尋找答案,但有太多的問題,可以導致這個錯誤。分割故障核心轉儲與C上的Ubuntu

char line[80]; 
char sett[50][80]; 
int index=0; 
static const char filename[] = "squid.conf"; 
FILE *file = fopen (filename, "r"); 

while (fgets (line, sizeof line, file) != NULL) 
{ 
    strcpy(sett[index],line); 
    index++; 
} 

我只是簡單地想要將整個文件寫入一個2維數組,逐行。 如果我引用//strcpy(sett[index],line);該程序運行正常,沒有錯誤。

+3

輸入文件中有多少行?如果它超過50個,你會在'sett'末尾寫下 – simonc

+2

鋤頭文件中有很多行嗎?如果你在一個調試器中運行,它將停在'strcpy'行,很可能'index'變量將大於50. –

+0

爲什麼不直接在'sett [index]中執行'fgets'? –

回答

1

正如其他人所說,也許你的squid.conf有超過50行,(我的squid.conf有4948行)

你可以指望前行()和malloc(nlines * 80),也可以使用鏈表:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

typedef struct sett { 
    char value[80]; 
    struct sett *next; 
} sett; 

int main(void) 
{ 
    char line[80]; 
    sett *curr, *first = NULL, *prev = NULL; 
    static const char filename[] = "squid.conf"; 
    FILE *file = fopen(filename, "r"); 

    while (fgets(line, sizeof line, file) != NULL) { 
     curr = malloc(sizeof(sett)); 
     if (curr == NULL) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     if (prev) { 
      prev->next = curr; 
     } else { 
      first = curr; 
     } 
     strcpy(curr->value, line); 
     curr->next = NULL; 
     prev = curr; 
    } 
    fclose(file); 
    curr = first; 
    while (curr) { 
     printf("%s", curr->value); 
     prev = curr; 
     curr = curr->next; 
     free(prev); 
    } 
    return 0; 
}