01 12 堆区

01 12 堆区

0 c、C++在malloc的区别

C自由,可以int* p = malloc(sizeof(int) * 5);
C++严谨,只能int* p = (int*)malloc(sizeof(int) * 5);

if (NULL == p),NULL写前面,= =写成 = 一下子能发现

只要是连续的空间都可以使用下标的方式访问内存
int* p = (int*)malloc(sizeof(int) * 5);
p[0]=100;

for循环的前加加与后加加
++i和i++在这里没有区别,因为它们的执行结果都是i = i +1
++i和i++的区别是:在一条语句中(即两个分号之间),++i 被当成(i+1)来计算,i++被当成i来计算。但是语句结束时,i总是增加了1.链接

free(ret);
ret = NULL;//free空指针多次没问题,但free野指针就会宕掉,所以指向NULL

定义变量要初始化,不然容易出bug
int a;a++;a=?;(不一定的)

01 当有两个指针指向堆区

图中的p是指getSpace()中的p,代码中的test1()中的p是为了验证注释中的猜想
在这里插入图片描述

#include <stdlib.h>
#include <stdio.h>

int* getSpace()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	if (NULL == p)
	{
		return NULL;
	}
	for (int i = 0; i < 5; ++i)
	{
		p[i] = i;
	}
	//看看p[i]有没有带'\0',没有
	printf("%p\n", p);
	return p;
}

void test1() {
	int* ret = getSpace();
	//看看ret的地址和下面的p比较,地址有没有给到p,可以给,只要给之前不free,NULL
	printf("%p\n", ret);
	for (int i = 0; i < 5; ++i)
	{
		printf("%d\n", ret[i]);
	}
	//给p地址注释掉,不然给不到
	//free(ret);
	//ret = NULL;//free空指针多次没问题,但free野指针就会宕掉,所以指向NULL

	//看看一块地址能不能被两个指针指向,可以,指向之前别free,NULL
	int* p = ret;
	printf("%p\n", p);
	for (int i = 0; i < 5; ++i)
	{
		printf("%d\n", p[i]);
	}

	//free(p);
	//p = NULL;
	free(ret);
	ret = NULL;
	//free/NULL指针ret后,指针p的值仍在,但是对空间的数据已经没了,打印乱码
	printf("%p\n", p);
	for (int i = 0; i < 5; ++i)
	{
		printf("%d\n", p[i]);
	}
	//free指针ret后,指针ret=NULL(0000 0000)
	printf("%p\n", ret);
}

void main() {
	test1();
	system("pause");
}

在这里插入图片描述

02 传到形参就丢了地址

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//test2
//.cpp严谨,这里的void不能通过,它要求是char*
void allocateSpace(char* p)
{
	p = malloc(100);
	memset(p, 0, 100);//初始化
	strcpy(p, "hello world");
	printf("%s", p);
}
void test2()
{
	char* p = NULL;
	allocateSpace(p);
	printf("%s", p);
}
void main() {
	test2();
	system("pause");
}

在这里插入图片描述

03 temp指向堆区,形参p将test3()中的p指向堆区地址

形参p(指向外部p的地址) == temp(指向堆区地址),外部p就拿到堆取地址
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//test3,二级指针,temp中间值
//一级指针只能拿到形参的地址,
void allocateSpace2(char** p)
{
	char* temp= malloc(100);
	memset(temp, 0, 100);//初始化
	strcpy(temp, "hello world");

	*p = temp;
}
void test3()
{
	char* p = NULL;
	allocateSpace2(&p);
	printf("%s", p);
}

void main() {
	//test1();
	//test2();
	test3();
	system("pause");
}

在这里插入图片描述

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值