一、静态开辟
#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。