需要更多信息!中止(核心已转储)

时间:2018-07-29 07:15:48

标签: c sorting pointers gcc memory

#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)

请帮助!输出正常,但不正确。代码正确地对单词进行了排序,但是我想知道为什么显示此回溯和核心转储消息并摆脱它!

2 个答案:

答案 0 :(得分:1)

您的void sort_words(char **w, int n)函数存在问题。

  1. 字符串复制为c正在使用函数strcpy()而不是=key = w[i];之类的语句应替换为strcpy(key, w[i]);
  2. 您必须通过char key[STRING_LEN];或使用malloc()为密钥分配内存。
  3. 您的排序逻辑可能不起作用。我已将其替换为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]