静态开辟C里内存开辟分静态开辟和动态开辟
int arr[5];// 静态开辟
// 下面为数组赋值
for (int i = 0; i < 5; ++i) {
arr[i] = i;
printf("%d, %p \n", *(arr + i), arr + i);
}
Java布尔类型定义为boolean, 而C中只有0和1, 非0即true, 0就是false
静态开辟内存也要注意, 不是随便开辟多大都可以,假如下面
int arr[10*1024*1024]; // 这是开辟了一个40M内存,因为在 栈里开辟所以会直接崩溃,栈溢出
// 因为在栈区,占用内存的大小的最大值为2M,当然有些平台会不一样,但是都不会很大
动态开辟
// 动态开辟内存方法malloc,是在堆区开辟的。
int * arr = malloc(1*1024*1024); // 开辟1M的堆内存,
// 堆里开辟的内存使用后一定要释放,这跟Java是不一样的
free(arr); // 释放内存 执行完后 arr就变成了悬空指针
arr=NULL; // 释放之后 需要指向NULL,
int *p; // 这是一个野指针,是没有地址的。
如果动态开辟了一块 内存,这时候想要加内存,这个时候realloc就派上了用场
int num = 10;
int arr = malloc(sizeof(int) * num);
// 假如这时候想要再加10个
int newAddNum = 10;
// void *realloc (void * 前面 开辟的指针, size_t总大小)
int *arr2 = realloc(arr, sizeof(int) * (num + newAddNum));
// 一般情况下,新的数组指向的和之前的地址是一样的,但是也有少数情况下会返回新的地址,如果返回新地地址的话,旧的地址也会跟着变。
// 如果返回的arr2为NULL ,则表示开辟新的大小失败,
// 业务做完都得做堆内存释放,但是不能重复释放, 所以得做处理
if (arr2){
free(arr2);
arr2 = NULL;
arr = NULL;
} else {
free(arr);
arr = NULL;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)