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

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

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; }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存