C 需要更多关于这个的信息!中止(堆芯转储)
请帮忙!输出是好的,但有些地方不对劲。代码是正确排序的话,但我想知道为什么这个回溯和核心转储消息显示,并摆脱它 问题在于您的C 需要更多关于这个的信息!中止(堆芯转储),c,sorting,pointers,gcc,memory,C,Sorting,Pointers,Gcc,Memory,请帮忙!输出是好的,但有些地方不对劲。代码是正确排序的话,但我想知道为什么这个回溯和核心转储消息显示,并摆脱它 问题在于您的void sort_words(char**w,int n)函数 字符串复制是c正在使用函数strcpy()而不是使用=。像key=w[i]这样的语句应替换为strcpy(键,w[i]) 您必须通过char key[STRING_LEN]为key分配内存或使用malloc() 您的排序逻辑可能不起作用。我将其替换为气泡排序逻辑 尝试此修改后的函数:- ** Error in
void sort_words(char**w,int n)
函数
c
正在使用函数strcpy()
而不是使用=
。像key=w[i]这样的语句代码>应替换为strcpy(键,w[i])代码>
char key[STRING_LEN]为key分配内存代码>或使用malloc()
气泡排序
逻辑** 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)
void排序\u单词(字符**w,整数n)
{
int i;
int j;
字符键[STRING_LEN];
对于(i=0;i0)
{
strcpy(键,w[j+1]);
strcpy(w[j+1],w[j]);
strcpy(w[j],键);
}
}
}
}
您的代码中存在多个问题:
- 循环测试不检查是否正确的
转换。在文件末尾,scanf()
返回的scanf()
不是EOF
。测试应该是0
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); } } } }
cccbaaa
(按换行符拆分):使用调试器。请注意,如果文件未以空格结尾,则scanf
将返回EOF
。它不是零。显示完整输出。请不要排序。对不起,我上面错了,当然%s
永远不会有匹配失败,因此scanf
将永远不会返回错误值,您将扫描整个数组的垃圾。恐怕您的解决方案不正确:如果为w[j]
和w[j+1]分配的空间
如果大小不同,则第二个或第三个strcpy将具有未定义的行为。
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);
}
}
}
}
while (num_words < ARRAY_LEN && scanf("%79s", word) == 1)
void sort_words(char **w, int n) {
int i, j;
char *key;
for (i = 1; i < n; i++) {
key = w[i];
for (j = i - 1; j > 0 && strcmp(w[j], key) > 0; j--) {
w[j + 1] = w[j];
w[j] = key;
}
}
}