尝试读取文本文件并对其进行q排序时出现Segmentation Fault 11

时间:2019-04-09 20:04:43

标签: c

在尝试读取.txt文件并在C中对其进行q排序时收到分段错误11。这是我的CS课的家庭作业,在其中,教授给了我们q排序功能他已经写过,我们需要使用posix使其更快。我在这里显示相关代码以读取文本文件,然后创建一个数组并对其使用q-sort。该程序适用于我编写的任意字符串数组,因此我可以肯定地确定这与我读取.txt文件并进行处理的方式有关。 Poem.txt在同一目录中,并且如果更改文件名,错误处理程序将起作用。有任何想法吗?

int main(){
double start, end;
double total;
char *array[100000];
char buffer[MAX_LENGTH];
int i = 0;
FILE *fp;
fp = fopen("poem.txt", "r");
if (fp < 0) {
    fprintf(stderr, "Couldn't open file to read in. | error number %d : %s \n", errno, strerror(errno));
    exit(1);
}
// First "function" to read in a text file for sorting

while (fscanf (fp, "%s", buffer) == 1) {
    array[i] = malloc (MAX_LENGTH);
    strcpy (array[i++], buffer);
}
// printf ("%s\n", array[1]);  /* print for troubleshooting */ 
start = clock();
sortThreaded (array, i);
// freeing the memory used in the array from Malloc
for (int j = 0; array[j]; j++){
    free(array[j]);
}
end=clock();
total = (end-start)/CLOCKS_PER_SEC;
printf(" total clocks: %f\n", total);
fclose(fp);
return 0;
}

2 个答案:

答案 0 :(得分:0)

我看到一些注意事项/可能性:

在检查fp时,如果fopen()失败,则会将其设置为NULL而不是负数,否则可能是来源或错误。

if (fp == NULL) {
    fprintf(stderr, "Couldn't open file to read in. | error number %d : %s \n", errno, strerror(errno));
    exit(1);
}

当您执行fscanfstrcpy()时,缓冲区可能溢出,最好执行fgets()strncpy()并指定MAX_LENGTH

 while (fgets (buffer, MAX_LENGTH, fp) != NULL) {
        array[i] = malloc (MAX_LENGTH);
        strncpy (array[i++], buffer, MAX_LENGTH);
    }

free()循环可以使用相同的迭代器i并递减,以确保我们释放分配的所有内容,不再少不了。

while (--i >= 0){
    free(array[i]);
}

当您尝试访问不允许访问或不存在的内存时,通常会发生分段错误。有时由MPU(内存保护单元)抛出。

答案 1 :(得分:0)

首先,如上所述,您应该检查

"list"

不是

if (NULL == fp)

因为fopen如果无法打开文件,则返回NULL。

第二,在fscanf中使用%s是不安全的。如果输入行长于MAX_LENGTH,您将收到“ *检测到堆栈粉碎** ”。

您可以使用

if (fp < 0)

char *fgets(char *s, int size, FILE *stream);

即使不是问题。

第三,数组未初始化。因此,它包含垃圾。在

fscanf (fp, "%99999s", buffer)

您可能正在释放一些未分配的地址。

for (int j = 0; array[j]; j++) {
    free(array[j]);
}