Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在malloc()之后成功释放()指针_C_Gcc - Fatal编程技术网

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

如何在malloc()之后成功释放()指针,c,gcc,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

基本上,我只是在学习如何分配内存和使用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;
   }
我想知道为什么会发生这种情况,我如何才能避免这种情况。我的方法对记忆不友好吗?这是怎么回事

如何重新编写代码使其工作

我没有从任何书籍、教程或任何东西中学习。我学习一门语言的方式是阅读编译器或IDE的源代码,或者是语言的编写方式——然后从那里开始。所以我真的没有任何参考资料。有人知道怎么解决这个问题吗

非常感谢!
~Phox

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

  #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);
   }
#包括
#包括
空干管(){
int*ip,i;
ip=(int*)malloc(10*sizeof(int));
如果(ip==NULL){
perror(“内存分配错误”);
返回;
}
电流p=ip;

对于(i=0;i而言,问题在于您的指针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;
}
#包括
#包括
静态int*ip,i,*tmp_-ip;
int main(){
tmp_ip=(int*)malloc(10*sizeof(int));
ip=tmp_ip;//使ip指向与tmp_ip相同的位置。

对于(i=0;i)您需要释放原始指针。您已经将指针增加了10倍。而不是说
ip++
ip+i
。您可能想知道您的C编写风格大约是从1970年开始的。它在现代C中看起来会有很大的不同。关于您的编辑器是
nano
的信息是否与您的问题相关?“问题必须表明对正在解决的问题的最低理解”…人们,即使是30k用户也不会对main的返回类型表示怀疑?这是对C的
null
C99(或更高版本)的添加?因为对于C90,我只知道
null
(或直接使用
0
(void*)0
)。即使在C++11中存在内置常量,它也是
nullptr
,而不是
null
@celtschk-简单的输入:对不起
  #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);
   }
#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;
}