如何在malloc()之后成功释放()一个指针

时间:2013-07-14 21:17:26

标签: c gcc

所以,我只是学习如何在C中分配内存和使用内存。我使用gcc编译和nano作为我的编辑器,这是我的代码:

   #include <stdio.h>
   #include <stdlib.h>

   static int *ip, i; 
   main (){
       ip=(int *)malloc(10*sizeof(int));
           for(i=0;i<10;++i){
               scanf("%d",ip++);
           }
       free(ip);
   return EXIT_SUCCESS;
   }

当我调用编译器时,我编译: cd Desktop / C / learn; gcc -W -Werror malloc.c -o run; ./run

程序成功编译但是在for语句完成并且调用了free(ip)指针后,编译器返回:

*** glibc detected *** ./run: free(): invalid pointer: 0x088ec030 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb75e9ee2]
./run[0x80484ce]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb758d4d3]
./run[0x80483d1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:06 23330986   /home/phox/Desktop/run
08049000-0804a000 r--p 00000000 08:06 23330986   /home/phox/Desktop/run
0804a000-0804b000 rw-p 00001000 08:06 23330986   /home/phox/Desktop/run
088ec000-0890d000 rw-p 00000000 00:00 0          [heap]
b753f000-b755b000 r-xp 00000000 08:06 14418881   /lib/i386-linux-gnu/libgcc_s.so.1
b755b000-b755c000 r--p 0001b000 08:06 14418881   /lib/i386-linux-gnu/libgcc_s.so.1
b755c000-b755d000 rw-p 0001c000 08:06 14418881   /lib/i386-linux-gnu/libgcc_s.so.1
b7573000-b7574000 rw-p 00000000 00:00 0 
b7574000-b7717000 r-xp 00000000 08:06 14418860   /lib/i386-linux-gnu/libc-2.15.so
b7717000-b7719000 r--p 001a3000 08:06 14418860   /lib/i386-linux-gnu/libc-2.15.so
b7719000-b771a000 rw-p 001a5000 08:06 14418860   /lib/i386-linux-gnu/libc-2.15.so
b771a000-b771d000 rw-p 00000000 00:00 0 
b7731000-b7735000 rw-p 00000000 00:00 0 
b7735000-b7736000 r-xp 00000000 00:00 0          [vdso]
b7736000-b7756000 r-xp 00000000 08:06 14418840   /lib/i386-linux-gnu/ld-2.15.so
b7756000-b7757000 r--p 0001f000 08:06 14418840   /lib/i386-linux-gnu/ld-2.15.so
b7757000-b7758000 rw-p 00020000 08:06 14418840   /lib/i386-linux-gnu/ld-2.15.so
bff5b000-bff7c000 rw-p 00000000 00:00 0          [stack]
Aborted

我想知道为什么会这样,我怎么能解决这个问题。我的方法对记忆不友好吗?这是怎么回事?

如何重新编写代码才能使其正常工作?

我没有从任何书籍或教程或任何东西中学习。我学习语言的方式是阅读编译器或IDE的源代码,或者编写语言的方式 - 然后从那里开始。所以我真的没有任何参考转向。任何人都知道如何解决这个问题?

非常感谢! ~Phox

2 个答案:

答案 0 :(得分:3)

问题是你的指针ip与malloc的第一位不一样。您可以通过制作临时指针来修复它。例如:

#include <stdio.h>
#include <stdlib.h>

static int *ip, i, *tmp_ip; 
int main (){
   tmp_ip=(int *)malloc(10*sizeof(int));
   ip = tmp_ip; // making ip to point the same place as tmp_ip.
   for(i=0;i<10;++i){
     scanf("%d",ip++);
   }
   free(tmp_ip);
   return EXIT_SUCCESS;
}

答案 1 :(得分:0)

问题是您需要保存原始指针以释放它:

  #include <stdio.h>
  #include <stdlib.h>

   void main (){
       int *ip, i; 
       ip=(int *)malloc(10*sizeof(int));
       if (ip == NULL) {
         perror ("Memory allocation error");
         return;
       }
       current_p = ip;
       for(i=0;i<10;++i){
           // increment another pointer; don't modify original pointer
           scanf("%d",current_p++);
       }
       free(ip);
   }

或等同地:

  #include <stdio.h>
  #include <stdlib.h>

   void main (){
       int *ip, *current_p, i; 
       ip=(int *)malloc(10*sizeof(int));
       if (ip == NULL) {
         perror ("Memory allocation error");
         return;
       }
       for(i=0;i<10;++i){
           // index; don't modify original pointer
           scanf("%d",ip[i]);
       }
       free(ip);
   }