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;
            }
        }
    }