#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_LEN 80
#define ARRAY_LEN 10000
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "Memory allocation failed! \n");
exit(EXIT_FAILURE);
}
return result;
}
int main(void) {
char word[STRING_LEN];
char *wordlist[ARRAY_LEN];
int num_words;
int i;
num_words = 0;
while (num_words < ARRAY_LEN && scanf("%79s", word)) {
wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]);
strcpy(wordlist[num_words], word);
num_words++;
}
sort_words(wordlist, num_words);
for (i = 0; i < num_words; i++) {
printf("%s\n", wordlist[i]);
}
for (i = 0; i < num_words; i++) {
free(wordlist[i]);
}
return EXIT_SUCCESS;
}
void sort_words(char **w, int n) {
int i;
int j;
char *key;
for (i = 1; i < n; i++) {
key = w[i];
for (j = i - 1; j > 0; j--) {
if (strcmp(w[j], key) > 0) {
w[j + 1] = w[j];
} else {
w[j + 1] = key;
break;
}
}
}
}
该程序基本上是用于对单词进行输入和排序的。
当我使用gcc -W -Wall -O2 -ansi -pedantic -g words_sorted.c -o ws
运行它时,我得到了一个巨大的堆栈跟踪,并说内核已转储。
我正在从文件 randwords.txt 中获取输入,并使用./ws < randwords
这是输出后的内存映射
** Error in `./ws': double free or corruption (fasttop): 0x0000000002443030 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x791fb)[0x7f844f2281fb]
/lib64/libc.so.6(+0x8288a)[0x7f844f23188a]
/lib64/libc.so.6(cfree+0x4c)[0x7f844f2352bc]
./ws[0x400756]
/lib64/libc.so.6(__libc_start_main+0xf1)[0x7f844f1cf401]
./ws[0x4007ba]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:2e 86686535 /home/cshome/s/skarmakar/242/lab05/ws
00600000-00601000 r--p 00000000 00:2e 86686535 /home/cshome/s/skarmakar/242/lab05/ws
00601000-00602000 rw-p 00001000 00:2e 86686535 /home/cshome/s/skarmakar/242/lab05/ws
02443000-024a6000 rw-p 00000000 00:00 0 [heap]
7f8448000000-7f8448021000 rw-p 00000000 00:00 0
7f8448021000-7f844c000000 ---p 00000000 00:00 0
7f844ef98000-7f844efae000 r-xp 00000000 08:02 67160174 /usr/lib64/libgcc_s-6.3.1-20161221.so.1
7f844efae000-7f844f1ad000 ---p 00016000 08:02 67160174 /usr/lib64/libgcc_s-6.3.1-20161221.so.1
7f844f1ad000-7f844f1ae000 r--p 00015000 08:02 67160174 /usr/lib64/libgcc_s-6.3.1-20161221.so.1
7f844f1ae000-7f844f1af000 rw-p 00016000 08:02 67160174 /usr/lib64/libgcc_s-6.3.1-20161221.so.1
7f844f1af000-7f844f36c000 r-xp 00000000 08:02 67232076 /usr/lib64/libc-2.24.so
7f844f36c000-7f844f56b000 ---p 001bd000 08:02 67232076 /usr/lib64/libc-2.24.so
7f844f56b000-7f844f56f000 r--p 001bc000 08:02 67232076 /usr/lib64/libc-2.24.so
7f844f56f000-7f844f571000 rw-p 001c0000 08:02 67232076 /usr/lib64/libc-2.24.so
7f844f571000-7f844f575000 rw-p 00000000 00:00 0
7f844f575000-7f844f59a000 r-xp 00000000 08:02 67232069 /usr/lib64/ld-2.24.so
7f844f67f000-7f844f782000 rw-p 00000000 00:00 0
7f844f797000-7f844f79a000 rw-p 00000000 00:00 0
7f844f79a000-7f844f79b000 r--p 00025000 08:02 67232069 /usr/lib64/ld-2.24.so
7f844f79b000-7f844f79c000 rw-p 00026000 08:02 67232069 /usr/lib64/ld-2.24.so
7f844f79c000-7f844f79d000 rw-p 00000000 00:00 0
7ffd62698000-7ffd626b9000 rw-p 00000000 00:00 0 [stack]
7ffd6277c000-7ffd6277e000 r--p 00000000 00:00 0 [vvar]
7ffd6277e000-7ffd62780000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
请帮助!输出正常,但不正确。代码正确地对单词进行了排序,但是我想知道为什么显示此回溯和核心转储消息并摆脱它!
答案 0 :(得分:1)
您的void sort_words(char **w, int n)
函数存在问题。
c
正在使用函数strcpy()
而不是=
。 key = w[i];
之类的语句应替换为strcpy(key, w[i]);
。char key[STRING_LEN];
或使用malloc()
为密钥分配内存。Bubble-Sort
逻辑。尝试此修改后的功能:-
void sort_words(char **w, int n)
{
int i;
int j;
char key[STRING_LEN];
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (strcmp(w[j], w[j + 1]) > 0)
{
strcpy(key, w[j + 1]);
strcpy(w[j + 1], w[j]);
strcpy(w[j], key);
}
}
}
}
答案 1 :(得分:0)
您的代码中存在多个问题:
循环测试未检查正确的scanf()
转换。在文件末尾,scanf()
返回EOF
,而不是0
。测试应该是
while (num_words < ARRAY_LEN && scanf("%79s", word) == 1)
sort_words
函数有一个缺陷:如果第一个条目大于key
,则它在w[1]
中重复,但是key
不会存储在{ {1}}。因此,排序不正确,并且第一个条目被释放了两次,从而产生错误跟踪。
您可以通过以下方式轻松修复代码:
w[0]