1

我用纯 C 编写的一些代码行有问题。它在 Windows 上运行良好,但在 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++;
}

我只是想将整个文件逐行写入一个二维数组。如果我引用该//strcpy(sett[index],line);程序运行良好,没有错误。

4

1 回答 1

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;
}
于 2013-02-01T19:46:36.207 回答