如何解决;n字节的写入大小无效";及;地址是大小为n alloc'的块后的n个字节;d";?

如何解决;n字节的写入大小无效";及;地址是大小为n alloc'的块后的n个字节;d";?,c,pointers,memory,valgrind,C,Pointers,Memory,Valgrind,valgrind--工具=memcheck--泄漏检查=是。/9算法 (这是我从valgrind收到的错误消息) 当我运行./9algorithm时,会出现以下错误: , Magnitude : , (null) *** Error in `./9algorithm': free(): invalid pointer: 0x00007fff8a4d7a10 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x80

valgrind--工具=memcheck--泄漏检查=是。/9算法 (这是我从valgrind收到的错误消息)

当我运行./9algorithm时,会出现以下错误:

, Magnitude : , (null)
*** Error in `./9algorithm': free(): invalid pointer: 0x00007fff8a4d7a10 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7f48a7eb3996]
./9algorithm[0x4011e0]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f48a7e54de5]
./9algorithm[0x400839]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:07 1965405                            /home/Desktop/9algorithm
00601000-00602000 r--p 00001000 08:07 1965405                            /home/Desktop/9algorithm
00602000-00603000 rw-p 00002000 08:07 1965405                            /home/Desktop/9algorithm
01377000-01398000 rw-p 00000000 00:00 0                                  [heap]
7f48a7c1d000-7f48a7c32000 r-xp 00000000 08:07 654085                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f48a7c32000-7f48a7e31000 ---p 00015000 08:07 654085                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f48a7e31000-7f48a7e32000 r--p 00014000 08:07 654085                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f48a7e32000-7f48a7e33000 rw-p 00015000 08:07 654085                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f48a7e33000-7f48a7ff0000 r-xp 00000000 08:07 658204                     /lib/x86_64-linux-gnu/libc-2.17.so
7f48a7ff0000-7f48a81f0000 ---p 001bd000 08:07 658204                     /lib/x86_64-linux-gnu/libc-2.17.so
7f48a81f0000-7f48a81f4000 r--p 001bd000 08:07 658204                     /lib/x86_64-linux-gnu/libc-2.17.so
7f48a81f4000-7f48a81f6000 rw-p 001c1000 08:07 658204                     /lib/x86_64-linux-gnu/libc-2.17.so
7f48a81f6000-7f48a81fb000 rw-p 00000000 00:00 0 
7f48a81fb000-7f48a821e000 r-xp 00000000 08:07 658180                     /lib/x86_64-linux-gnu/ld-2.17.so
7f48a8403000-7f48a8406000 rw-p 00000000 00:00 0 
7f48a8418000-7f48a841d000 rw-p 00000000 00:00 0 
7f48a841d000-7f48a841e000 r--p 00022000 08:07 658180                     /lib/x86_64-linux-gnu/ld-2.17.so
7f48a841e000-7f48a8420000 rw-p 00023000 08:07 658180                     /lib/x86_64-linux-gnu/ld-2.17.so
7fff8a4b9000-7fff8a4da000 rw-p 00000000 00:00 0                          [stack]
7fff8a5ca000-7fff8a5cc000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
main.c (第223行-写入大小无效) (第233行-写入大小无效) (第226行-块后的地址…)


我找不到问题的根源。当我尝试使用另一种算法时,我使用的外部函数似乎起作用。但是对于这一个,它与我的main.c有问题。您的逻辑在

 h++;
 line[h] = 0;
我想这个角色没有被分配

此外:

  • 铸造
    malloc
    和friends的返回很容易隐藏微妙的bug, 不要那样做
  • sizeof(char)
    根据定义是
    1

    • 你不应该那样做。取而代之

      char *temp;
      
      temp = realloc(line, (h+1) * sizeof(char));
      if(!temp){
          printf("Error on realloc on line");
          free(line);
          return 1;
      }
      else{line = temp;}
      
      瓦尔特

      每次你写

       line = (char *)malloc(1 * sizeof(char));
      

      它只为行分配一个字符。可能你指的是不止一个字符,比如当你使用realloc时。您还可以在循环中每次使用大小为1的malloc命令对其进行malloc,只要您没有遇到换行符,换行符只会覆盖上一个指针,从而泄漏1个字符的内存 以下是一些有用的Valgrind技巧-


      与您的问题无关:您应该使用NULL而不是0来初始化指针。在C语言中,您可以使用。注意!:)谢谢:)我投不投有什么区别@Joachim Pileborg阅读链接的答案。它实际上可以产生不同。所以我需要初始化另一个变量temp?@mahrkiee是的,因为如果realloc失败,那么该行将变为NULL,并且您无法再释放它。我将realloc放在哪里?在“h++;”表达式之前,realloc(行,0)是否与sa free(行)相同@只要你在
      main
      中使用这些东西,就没有真正的必要
      释放它们,一旦
      main
      返回,它们就会被操作系统收回。如果这是一个通用函数,可以在任何地方调用,那么您只需要在函数末尾释放它,就像您在e_quakePtr.realloc(p,0)->我的手册页上说“如果大小为零,ptr不为NULL,则分配一个新的最小大小的对象,并释放原始对象。”标准没有对这种情况做任何说明,只是“未指定的行为”是“当请求的大小为零时,calloc、malloc和realloc函数是否返回null指针或指向分配对象的指针”,所以realloc可能返回null,或者只分配1个字节,我不知道
      char *temp;
      
      temp = realloc(line, (h+1) * sizeof(char));
      if(!temp){
          printf("Error on realloc on line");
          free(line);
          return 1;
      }
      else{line = temp;}
      
       line = (char *)malloc(1 * sizeof(char));
      
          free(line);
      
          line = (char *)malloc(1 * sizeof(char));
      
       1 * sizeof(char) == 1 * 1 == 1
      
        line = malloc(n * sizeof(*line));