用了malloc后没有使用free,之前分配的内存还能使用吗?

准备搞两个程序试试。

	int* a = (int *)malloc(4*sizeof(int));
	*(a+1) = 111;
	printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
	getchar();

a[1]'s address = 0x56106ca992a4,and a[1] is 111


另1个:

#include <stdio.h>
int main(int argc, char *argv[])
{
	int *p =(int *)0x56106ca992a4;
	printf("%d\n",*p);


	return 0;
}

Segmentation fault (core dumped)

	int *p = NULL;
	printf("%d\n",*(p+0x56106ca992a4));

发现稍微换了一下代码也不行。emmm,我想直接查看OS的内存地址。直接找到0x56106ca992a4~0x56106ca992a8的每1个字节,然后组成32位的int值。

直接:linux check memory address value

查看发现,是用客户端实现这一功能的,唯一的应该是gdb。担不是gdb a.out什么的,而是要搭配管道以及进程号才可以。太麻烦了,不去试了。

所以,这段程序进入os后得到的内存的值可能是虚拟的地址,可能是其他的,反正是经过变换的,而且其他进程是无法访问的。(共享内存。。。)

如果malloc就相当于申请了一块大小的内存。
返回这个地址的首地址给1个指针。如果它在程序中一直没有使用,那么就会导致内存的白白占用。此时不是内存泄漏。

而如果它在程序中没有被free就被指向另一块地址了,那么就会导致这块地址在这个进程中永远无法被找到。
这样就会导致内存泄漏。也就是无用的内存越来越大,操作系统得一直给这个进程分配内存,导致最终内存的无法给予。

但是我又不想这么放弃,如果在一个程序中呢?

	int* a = (int *)malloc(4*sizeof(int));
	*a = 11;//elem1
	*(a+1) = 111;// elem2
	*(a+2) = 222;// elem2
	*(a+3) = 333;// elem2


	printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
	free(a);
	while(1)
	{
		int *temp = NULL;
		printf("Please input your pointer:\n");
		scanf("%p",&temp);
		printf("the value of this address:%p is :[%d]\n",temp,*temp);
	}

输出:

a[1]'s address = 0x55b4b2fa82a4,and a[1] is 111
Please input your pointer:

推测:
0x55b4b2fa82a0 – &a[0]
0x55b4b2fa82a4 – &a[1]
0x55b4b2fa82a8 – &a[2]
0x55b4b2fa82ac – &a[3]

a[1]
在这里插入图片描述
a[2]
在这里插入图片描述
a[3]
在这里插入图片描述
a[0]
在这里插入图片描述

再连续做一遍:
在这里插入图片描述


这个是free之后的,可以看到free了以后内存上面就已经面目全非了。

然后再变成一个指向其他内存,而不free的。


	int* a = (int *)malloc(4*sizeof(int));
	*a = 11;//elem1
	*(a+1) = 111;// elem2
	*(a+2) = 222;// elem2
	*(a+3) = 333;// elem2
	a = (int *)malloc(4*sizeof(int));
	printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
	while(1)
	{
		int *temp = NULL;
		printf("Please input your pointer:\n");
		scanf("%p",&temp);
		printf("the value of this address:%p is :[%d]\n",temp,*temp);
	}


在这里插入图片描述
可以看到这块内存全部都是0.

而没指向另一块地址以前是这样的:

我们现在来点题,看能不能用。当然就只测试a[1]了。

	int* a = (int *)malloc(4*sizeof(int));
	*a = 11;//elem1
	*(a+1) = 111;// elem2
	*(a+2) = 222;// elem2
	*(a+3) = 333;// elem2
	a = (int *)malloc(4*sizeof(int));
	printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
	int *temp = NULL;
	printf("Please input your pointer:\n");
	scanf("%p",&temp);
	*temp = 999;
	printf(" (temp->) modify:%d\n",*temp);
	printf(" (a->) :%d\n",*a);

在这里插入图片描述
没报错,答案是肯定可以使用,但注意不要丢失地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值