C语言中的free函数如何正确使用
free函数的用法释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。
free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便。如在分配指针时,用的是new或new[]。
在释放内存时,并不能图方便而使用free来释放。反过来,用malloc 分配的内存,也不能用delete/delete[]来释放。
举例:
int* p = (int *) malloc(4);
*p = 100;
free(p); //释放 p 所指的内存空间
或者:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
……
free(p);
扩展资料
1、free是和malloc、realloc或者calloc函数成对出现的,来保证动态分配的空间及时释放。
2、一块动态申请的内存用free释放一次就够。
free(*add(a,b));显然是写错了,应该是free(add(a,b));才对。改后从原理到语法都是正确的,是完全合法有效的。但为了释放内存,要调用两次自定义函数add这种操作值得吗?回答肯定是否定的;再说调用两次自定义函数就进行了两次malloc操作,释放的只是第二次调用申请的内存,第一次调用时申请的内存并没有释放,所以还是在主调函数中用一个指针变量接收的好,不然是有所谓内存泄漏的。
free只能释放由堆动态申请的空间,但是第一个中p,q两个不同的指针变量指向同一片地址,free(q);
q = NULL;
后,q和p指向的空间被释放,且q被赋值为NULL,但是此时p变量的值并没有改变,即其值还是原来申请的空间的首地址。这里注意原来申请的空间已被释放,只是p还保留那篇空间的首地址值,所以一般开发中释放空间后,要把相关变量赋值为NULL,以防后面会非法访问一个已经释放的空间。
第二个,释放了。
先看下这段程序
#include <stdio.h>
#include <malloc.h>
void main()
{
int *p=(int *)malloc(sizeof(int)*5);
int *q;
q=p;
free(q);
q=NULL;
if(p)printf("yes");
else printf("no");
}
输出结果是yes,这个时候p,q指向同一段内存空间为什么释放不了呢?是不是一定要free(p)才能释放?
q=p; 这时只是将p所指向的地址赋值给q,所以free(q)对p没有影响,你可以这么做q=&p
第二个程序是s=p->next;free(s)后,p->next指向的还是以前的地址,不过这个地址没有数据罢了
有啊,不过最好再将p->next赋值为空,否则它还是指向那片空间的,用的时候会出现不确定的值
函数原型: void free(void *ptr)
参数: 任何类型的指针(指向因调用malloc、realloc以及calloc函数分配得到的空间的指针)
功 能: 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。
注意:free一定是和malloc、realloc或者calloc函数成对出现的,来保证动态分配的空间及时释放,否则会造成内存泄漏,这是正确使用free的一个重要前提,还有就是一块动态申请的内存用free释放一次就够了。
实例:
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* allocate memory for string */
str = (char *)malloc(10);
if(str == NULL){
perror("malloc");
exit(1);
}
/* copy "Hello" to string */
strcpy(str, "Hello");
/* display string */
printf("String is %s\n", str);
/* free memory */
free(str);
return 0;
}
啊实打实的
C语言中free怎么用?是只能用于指针变量吗?它如果释放静态内存会有什么结...
free 只是用来释放 malloc 函数在堆上申请的空间 别的什么也干不了!用法:如 int *p = malloc (sizeof(int) * 4)free(p);
free函数的用法!!c语言,急急急急急急!
free(str)释放指针所指向的空间,但str不会自动指向NULL,str的值不会变,他还是指向那块内存,只不过那块内存现在已经不归他使用了。你之所以还能使用strcp(str, "hello"); 向这块内存继续写入东西,那完全是由于你的运气,系统随时有可能将这块空间分配给别的程序,从而导致访问错误。
C++ free()函数的应用
free()为C语言函数。头文件:malloc.h或stdlib.h 作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间的函数。使用后该指针变量一定要重新指向NULL,防止野指针出现,有效 规避误操作。用 法: void free(void *ptr);程序例:include <string.h> include <stdio.h> include <alloc.h> ...
c语言free的作用
功 能:与malloc()函数配对使用,释放malloc函数申请的动态内存。(另:如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。)用 法:void free(void ptr);程序例:include include include \/\/or include int main(...
C语言里如何使用free()释放字符串内存
free(p-1);\/\/这句倒是正确的,因为经过p++,这里的p-1刚好是malloc申请的地址 return 0;} 另外,问你一个同样的问题:char *p1 = new char[10];char *p2 = new char[20];delete p1[];delete p2[];释放p1和p2的时候,没有指明大小,它怎么知道p1是10,p2是20的呢?如果不知道,它怎么...
如何在C语言中使用ftell函数获取文件的长度?
"%s",p); fclose(fp); free(p); return 0;}改进后的程序,读取文件长度:include <stdio.h>main(){ FILE *myf; long f1; myf=fopen("1.txt", "rb"); fseek(myf,0,SEEK_END); f1=ftell(myf); fclose(myf); printf("%d", f1);} ...
c语言中的FREE的用法如题 谢谢了
因为这是固定分配空间而不是动态分配空间! 这样吧,给你个例子 1. void main(){ int a[100]; free(a);\/\/出错,无法释放固定空间。在程序结束后此空间自动释放 } 2. #include <malloc.h> void main(){ int *a; a=(int*)malloc(sizeof(int)*100);\/\/相当于int a[100],只是用动态空间...
关于C语言中free函数的使用
改后从原理到语法都是正确的,是完全合法有效的。但为了释放内存,要调用两次自定义函数add这种操作值得吗?回答肯定是否定的;再说调用两次自定义函数就进行了两次malloc操作,释放的只是第二次调用申请的内存,第一次调用时申请的内存并没有释放,所以还是在主调函数中用一个指针变量接收的好,不然是有...
c 语言中的free 函数 用法
不能。FREE不能依靠单纯的指针去释放。你去看看BMP文件的结构,看看很多的程序的结构,他们的结构体中都会存有数据的大小,而且因为面对的是数据流,所以大小往往被放在最开头。 同样的,你MALLOC(10) ,实际上一定会大于10,它要在内部去存储开辟内存的大小的数据,依次来决定释放的字节。 看见p - 2...
C语言:关于FREE()函数的用法
不可以的。malloc, alloc, free是c定义的一组内存管理的API函数,当你调用malloc、alloc分配内存时,不仅仅是从堆里面分配得到了可用内存,实际上内存管理子系统还会维护了内存列表。你自己定义的指针不会在这个列表中的,所以free会出问题的。那么,使用new, GlobalAlloc之类的方式分配的内存可不可以使用...