【发布时间】:2011-07-19 06:00:48
【问题描述】:
一些前言:我是一名计算机工程专业的学生,在学习了 3 个学期的 Java(直至数据结构)后,我正在上 C 的第一堂课。这个问题与家庭作业有关,但离我解决它还有几个步骤。
我有一个读入内存的输入文件,它存储在 char[9][500] 中。我最多读入 500 个最大长度为 8 的字符串。我正在尝试使用 stdlib 内置的 qsort() 函数对该数组进行排序,但出现了一些内存错误。
重要的sn-ps代码:
char data[4][500][60];
char debug[500][9];
size_t count = 0;
/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");
while(!feof(pUserlog))
{
fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
fgets(data[3][count], 60, pUserlog);
count++;
}
本节将数据读入数组。这部分感兴趣的数组是“调试”。这是上面指定的数组。这是我对 qsort 的比较函数:
int compare(const void* a, const void* b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
puts("I'm in compare!");
return strncmp(*ia, *ib,8);
}
这是我尝试调用 qsort:
size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);
我尝试在 count 所在的调用中替换 debug_len,但仍然存在段错误。这是输出:
$ ./测试 调试长度:1125,计数:453,sizeof(char*):4 我在比较! 分段错误(核心转储)谢谢!
【问题讨论】:
-
while( !feof() ) 是错误的。 feof 将返回 false,进入循环,scanf 将无法读取数据,debug[count] 将包含虚假数据,然后 feof 将返回 true。您可以通过在循环之后执行 count-- 来解决这种情况,但一般来说,您不应该简单地执行 while(!feof())
-
段错误在哪里?检查核心转储以确定段错误发生的位置是一个很好的练习,因为这通常可以告诉您问题所在。
标签: c arrays string segmentation-fault qsort