在尝试读取.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;
}
答案 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);
}
当您执行fscanf
和strcpy()
时,缓冲区可能溢出,最好执行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]);
}