C语言里如何使用free()释放字符串内存

在C++里有delete和delete[]以区别单个变量与数组,但是C语言里只有free(),请问它是如何区别一个指针所指向的是单个变量还是一个数组呢?
char *p1, *p2, *p;
p1=malloc(20);
p2=malloc(40);
memset(p1, 'a', 20);
memset(p2, 'b', 40);

p1[5]='/0';
p=p1;
free(p); /* 它怎么知道要释放多少内存?能正确释放吗? */

p2[10]=0;
p=p2;
free(p); /* 它怎么知道要释放多少内存?能正确释放吗? */

由于free和malloc配对使用,malloc的时候,大小已经告诉系统了。

free的时候,系统会比对一下这个地址,是不是malloc申请的,如果不是,不给释放

如果是的话,系统就知道要释放多大内存,因为malloc的时候,系统有记录的。

当然了,申请的地址,也记录了的,否则,就无法比对了。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;

p=(int *)malloc(sizeof(int)*3);
p[0]=1;p[1]=2;p[2]=3;
p++;
//free(p);/////////由于p++过,已经不是malloc申请的那个地址了,因此这句运行会报错
p[0]=4;
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的呢?
如果不知道,它怎么去争取的释放它们呢?
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-02
有点意思的问题。我一开始只是猜测,但写了个例子测试了下,发现我的猜测还是正确的。

在C里面无论是数组还是单个变量,他都可以看成是数组,单个变量其实就是长度为1的数组(可以这么理解吧),C中以\0来表示一个数组结束(但有一点要弄明白,C不检查数组长度,虽然它能得到数组长度).所以你的问题好回答了。首先它们都是数组,只不过单个变量的长度为1,其次我释放的时候碰到\0就结束就可以了。下面是我一个测试的例子,应该不难懂。

[root@liumengli MSG]# cat test.c (如果不懂shell这里是注释,cat是现实test.c文件的内容)
#include "stdio.h"

int main() {
int * a = (int *)malloc(sizeof(int));
int * b = (int *)malloc(10*sizeof(int));
printf("%ld, %ld\n", a, b);
if(a[1] == '\0')
printf("a[1] is end\n");
if(b[10] == '\0')
printf("b[10] is end\n");
free(a);
free(b);
}
[root@liumengli MSG]# gcc test.c -o test(gcc是编译器,相当于tc,当然比TC要强大点)
[root@liumengli MSG]# ./test
134520840, 134520856
a[1] is end
b[10] is end
[root@liumengli MSG]#

这只是最简单的理解,我想真正的内存释放完全没有这么简单,内存都是以页为单位的(linux中一页大小是4K),就是说要分配就分配就分配一页,要释放就释放一页,没有分一个数组这种说法,我打印过a和b的地址,他们逻辑地址中反映他们应该是处于同一页的,我估计free应该是减少了页的共享计数,而没有释放内存页面,真正的释放应该是在进程结束后,操作系统检查该页的共享计数为0的时候,将该页标记为没有使用。(当然个人理解,当初看释放页面代码的时候没太明白).
第2个回答  2008-12-02
p2依然是分配好的内存首地址,可以正确释放,你只是用数组下标来操作指针,本质上p2没有任何改变.
为什么可以正确的释放正确大小的地址,有的编译器会这样操作,malloc会在首地址前8个字节的高4存放page id,低4存放size,free可以从这里取到内存的大小,依赖编译器的不同实现方法不同,仅供你参考。
第3个回答  2008-12-02
假设
p1 = 0x12400;
p2 = 0x12800;
那么 0x12400,0x12800 这两个值程序是有记录,有标识的

free( (void*)0x12400 ); 这样写是可以的!
第4个回答  2020-06-03
1、free函数:
原型:void
free(void
*ptr);
功能:释放malloc(或calloc、realloc)函数给指针变量分配的动态内存;
头文件:malloc.h或stdlib.h;
2、为了避免释放已经释放了内存的指针内存,或没有释放内存,在c语言中最好是在定义指针时赋初值null,释放后立即赋null,释放时检查指针值再决定释放就避免释放错误了,例如:
int *a = null
int *b = (int*) malloc(sizeof(int) * 10);
a= b;
/* 执行大量操作后 */
if(a != null) {free(a);a=null;}
if(b != null) {free(b);b=null;}

C语言里如何使用free()释放字符串内存
int main(){ int *p;p=(int *)malloc(sizeof(int)*3);p[0]=1;p[1]=2;p[2]=3;p++;\/\/free(p);\/\/\/由于p++过,已经不是malloc申请的那个地址了,因此这句运行会报错 p[0]=4;free(p-1);\/\/这句倒是正确的,因为经过p++,这里的p-1刚好是malloc申请的地址 return 0;} 另外,...

C语言如何用free
int main(){ int *p = (int *)malloc(10);\/\/动态申请10字节内存空间 free(p);\/\/释放申请的内存空间 getchar();return 0;}

C语言中free函数的用法
free函数的用法释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete\/delete [] 要方便。如在分配指针时,用的是new或new[]。在释放内存时,并不能图方便而使用free...

c语言中 free的用法~
free(p);free 不管你的指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete\/delete [] 要方便。不过,必须注意,如果你在分配指针时,用的是new或new[],那么抱歉,当你在释放内存时,你并不能图方便而使用free来释放。反过来,你用malloc 分配的内存,也不能用delete\/delete[] 来释放。

free函数的用法
一、基本用法 在使用Free函数时,需要包含头文件。其基本语法为:c void free;其中,ptr是一个指向已分配内存的指针。当不再需要该内存时,可以使用Free函数来释放它。二、使用注意事项 1. 释放的内存必须是动态分配的。通过malloc、calloc或realloc等函数分配的内存可以使用free来释放。对于栈上的内存或...

请问C语言的free如何释放空间?
你分配内存的长度在运行时库里有记录的 free会自己找到具体长度 不用程序员去关心, 所以你只调用free就可以 出错原因是不是你重复释放了? 每次free之后一定要把指针赋为NULL , 例如 free(a); a=NULL;

c 语言free函数用法
free()释放已分配内存的函数 原形:void free(void *block)功能:释放由calloc、malloc、realloc函数调用所分配的内存。头文件:stdlib.h、alloc.h 所以你上面所做的和没加free(p)是一样的额

c语言代码 如何释放资源
如果是new 出来的内存资源的话,那么就用delete释放,如果是malloc分配出来的内存资源的话,那么就用free()释放。例如:char* c = new char[20]; \/\/new 一个char类型内存的数组 char *ptr =(char*)malloc(sizeof(char)*20); \/\/malloc分配20个char类型的内存 delete c; \/\/释放c的...

C语言中free怎么用?是只能用于指针变量吗?它如果释放静态内存会有什么结...
free 只是用来释放 malloc 函数在堆上申请的空间 别的什么也干不了!用法:如 int *p = malloc (sizeof(int) * 4)free(p);

C语言 free()函数的使用规则
比如 int *a = (int*)malloc (100*sizeof(int));int *b = a, *c = a + 10;那么free(b) 和 free(a)是合法,他们的工作都是释放申请的a的内存100个int 再如用递归创建链表,node* a = (node*)malloc(sizeof(node));a->next = (node*)malloc(sizeof(node));... ...free(a...

相似回答