C语言结构体数组内存释放问题
#include <stdio.h>#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct test
{
int a;
int b;
}Test,*pTest;
int main()
{
pTest = (struct test*)Test;
int i = 0;
for(i = 0;i<10;i++)
{
(pTest+i)->a = i;
(pTest+i)->b = i+1;
}
struct test *p;
p = malloc(sizeof(struct test)*10);
memcpy(p,pTest,sizeof(struct test)*10);
free(p);
return 0;
}
怎么才能释放p指向内存里面的所有数组的内容 目前这个写法只能释放结构体首地址里面的内容 free 可以释放 malloc 等函数分配的内存,从首地址起全部释放。 赚小钱 发表于 2020-7-18 17:32
free 可以释放 malloc 等函数分配的内存,从首地址起全部释放。
不会呀 只释放首地址的 我测试过 随风浩荡几万里 发表于 2020-7-18 17:37
不会呀 只释放首地址的 我测试过
肯定全部被释放了。你是怎么测试的? 永恒的蓝色梦想 发表于 2020-7-18 17:56
肯定全部被释放了。你是怎么测试的?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct test
{
int a;
int b;
}Test,*pTest;
int main()
{
pTest = (struct test*)Test;
int i = 0;
for(i = 1;i<11;i++)
{
(pTest+i-1)->a = i;
(pTest+i-1)->b = i+1;
}
struct test *p;
p = malloc(sizeof(struct test)*10);
memcpy(p,pTest,sizeof(struct test)*10);
//int j = 0;
//for(j = 0;j<10;j++)
free(p);
printf("%d%d\n",p->a,(p+1)->a);
return 0;
p+1里面还有值 随风浩荡几万里 发表于 2020-7-18 18:09
#include
#include
#include
你这个回答让我一时间不知道说什么?
首先,什么叫做被释放?
在计算机科学中,可以重复利用即资源被释放。
比如常见的,删除文件,格式化磁盘。
其次,如果要求每次释放资源都必须将目标位置的数据清零,那么 c 如何保证效率。
1. cpu 要花费时间将内存的旧数据重写一遍
2. 其他申请内存的请求需要等待 cpu 清零
不觉得多此一举吗 随风浩荡几万里 发表于 2020-7-18 18:09
#include
#include
#include
释放了不代表清空了 赚小钱 发表于 2020-7-18 18:19
你这个回答让我一时间不知道说什么?
首先,什么叫做被释放?
感谢您的耐心回复 是这样的 我有个函数需要读入一个结构体数组 这个结构体数组是其它线程还写入 我这个函数读取,所以 在这个函数里面我要做一个缓存来存储这个结构体数组里面的数据,所以我就用malloc在堆里面分配空间,来当做缓存,按照您的意思 用malloc分配的话不合理 因为函数结束 缓存必须被清空才行,所以我应该直接在栈里面分配,函数结束 内存自动释放了 一般malloc后释放这两句是不能少的。
free(p);
p = NULL; 永恒的蓝色梦想 发表于 2020-7-18 18:27
释放了不代表清空了
我太菜了,所谓的释放应该就是告诉编译器这块内存使用完毕,而不是清0 随风浩荡几万里 发表于 2020-7-18 18:29
感谢您的耐心回复 是这样的 我有个函数需要读入一个结构体数组 这个结构体数组是其它线程还写入 我这个函 ...
这个结构体数组是其它线程还写入 我这个函数读取
不太理解,什么是其他线程还写入
我可以没有说 malloc 分配不合理这种话,而且,函数结束回收资源并不等于要在栈上分配内存。
考虑使用栈还是堆,应该从
1. 内存大小是否编译期可知(当然存在方法动态在栈上分配内存)
2. 期望申请的内存大小是否会爆栈,即使编译期可知大小,但超过栈的限制,也应该使用堆内存(当然,可以使用 static 变量)
3. 需要通过函数返回的内存,应该使用堆
再来说你的问题,你说要做一个缓存,那只需要
1. 获取锁
2. 分配与目标同样大小的内存(根据上面的原则决定使用堆还是栈)
3. memcpy
4. 释放锁
5. 愉快地使用你的缓存
6. 清理堆内存(栈上的不用管)
赚小钱 发表于 2020-7-18 18:58
不太理解,什么是其他线程还写入
我可以没有说 malloc 分配不合理这种话,而且,函数结束回收资源并 ...
学到了 谢谢 随风浩荡几万里 发表于 2020-7-18 18:29
感谢您的耐心回复 是这样的 我有个函数需要读入一个结构体数组 这个结构体数组是其它线程还写入 我这个函 ...
函数结束也不会清空。只是可以重复利用而已。如果函数没结束。其它的像代码是不会被写进这个变量里的。因为知道你要用。函数结束后,你不用了,它就可以被系统任意程序写任何东西。不是清零。你想要填0,就得自己去花时间填。正如你写作业一样,你觉得写错了字,该字不要了,你想改掉这个字,必须擦除。擦除等于又把它写白了。就算你用橡皮檫,还要花时间去弄。如果都像你这样,那电脑要卡得要死。每次删东西都要花时间填0,那谁还用电脑?
页:
[1]