Android 音视频入门之C入门序列(六)- 内存开辟

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值