重学三、内存开辟

一、静态开辟

#include <stdio.h>

// 函数进栈 定义一个int arr[5]; 

//定义一个 int i;  (静态的范畴)

// 进栈
void staticAction() {
	int arr[5]; //	 栈区 (栈成员)

	for (int i = 0; i <5; ++i) {
		arr[i] = i;
		printf("=========%d, %p\n", *(arr + i), arr + i);
	}
} 

// 函数的末尾会弹栈(隐式):执行完毕会弹栈  会释放所有的栈成员

/* 2.静态开辟。*/
int main() {

	while (1) {

		staticAction(); 
	}

	return (0);
}


运行结果:

=========0, 00B12E34
=========1, 00B12E38
=========2, 00B12E3C
=========3, 00B12E40
=========4, 00B12E44
=========0, 00B12E34
=========1, 00B12E38
=========2, 00B12E3C
=========3, 00B12E40
=========4, 00B12E44

二、动态开辟

malloc 在堆区开辟的内存空间 , (动态的范畴)

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


void dynamicAction() {
	int * p;             // 野指针  没有地址的,空的

	// void * 可以任意转变   int*  double *

	int * arr = (int *)malloc(1 * 1024 * 1024); // 堆区开辟 1M

	printf("dynamicAction函数,arr自己的内存地址:%p,堆区开辟的内存地址:%p\n", &arr, arr);

	// 堆区开辟的空间,必须释放
	free(arr); // 释放掉
	arr = NULL; // 重新指向一块内存地址00000

}

int main() {

	while (9) {
		// sleep(100);
		dynamicAction(); // 调用开辟20
	}

	return 0;
}

malloc开辟堆区,配合 free释放堆区开辟的空间,比如上面的arr指针如果被free(arr)了,没有arr = NUL时 也就是我们所说的 悬空指针。 

realloc


int main() {

	int num;
	printf("请输入个数");
	// 获取用户输入的值
	scanf_s("%d", &num);

	// 5个值
	int * arr = (int *)malloc(sizeof(int)* num);
	for (int i = 0; i < num; ++i) {
		arr[i] = (i + 10001); 
	}
	printf("开辟的内存指针: %p\n", arr);



	// 新增
	int new_num;
	printf("请输入新增加的个数");
	scanf_s("%d", &new_num);

	

	int * new_arr = (int *)realloc(arr, sizeof(int)* (num + new_num));

	if (new_arr) { // new_arr != NULL 我才进if  【非0即true】
		int j = num; //
		for (; j < (num + new_num); j++) { // 5 6 7 8
			arr[j] = (j + 10001);
		}

		printf("新 开辟的内存指针: %p\n", new_arr);

		// 后 打印 内容
		for (int i = 0; i < (num + new_num); ++i) {

			printf("新 元素的值:%d, 元素的地址:%p\n",
				*(arr + i),
				(arr + i)
				);
		}
	}



	if (new_arr) {
		free(new_arr);   // 如果不赋值给NULL,就是悬空指针了
		new_arr = NULL;
	}

	return 0;
}

realloc 使用:void *realloc (void *前面开辟的指针, size_t总大小);

输出结果:

请输入个数1
开辟的内存指针: 013193D0
请输入新增加的个数1
新 开辟的内存指针: 013193D0

三、总结

 1》静态开辟的内存空间大小,是不能修改的,如果不需要动态修改空间大小,当然使用 栈区 尽量使用 静态开辟的,如果实在是需要动态改变我们就使用malloc、realloc。

2》静态开辟内存 申请的是栈区的,动态开辟 申请的是堆区的。

3》relloc 返回 null 后,原来的数组发生了什么变化: 没有扩展成功而已。

4》野指针:没有初始化。

5》悬空指针是指向的地址被释放掉了 没有置为 NULL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值