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

来源:百度知道 编辑:UC知道 时间:2024/05/21 22:30:03
在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的呢?
如果不知道,它怎么去争取的释放它们呢?

有点意思的问题。我一开始只是猜测,但写了个例子测试了下,发现我的猜测还是正确的。

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

[root@liumengli MSG]# cat test.c (