C语言进阶:动态分配内存,二维指针

动态分配内存

1.数组空间申请

申请动态分配内存 malloc()
stdlib.h 中定义函数 void* malloc(size_t size)
向系统申请大小为 size 的内存空间
返回结果是 void*,使用时转换成需要的指针类型
如果申请失败,返回 NULL

向系统申请一块 n*4 字节的空间
(int*)malloc(n*sizeof(int))

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

int main(){
   
        int n;
        scanf("%d",&n);
        // 等同于 int arr[n];
        int* arr = malloc(n*sizeof(int));
        for(int i=0;i<n;++i){
   
                scanf("%d",arr+i);
        }
        for(int i=0;i<n;++i){
   
                printf("%d ",arr[i]);
        }
        printf("\n");

        free(arr);   // 释放指针
        arr = NULL;
}

结果为:

5
1 2 3 4 5
1 2 3 4 5 

释放动态分配内存 free()
注意 free() 的问题:
已经释放了,但每清空,就会形成野指针,野指针如果再次使用,就会报错

另外还有一个函数
calloc(n,sizeof(int))
格式与 malloc() 不同,但作用和 malloc() 相同

2.重新调整内存大小

函数 作用
malloc() 分配内存块,不初始化
calloc() 分配内存块,初始化为0
realloc() 调整先前分配的内存块大小
free() 释放分配内存块

从终端输入未知个数的数字,用ctrl+d结束,并输出所有输入的数

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

int main(){
   
        int* arr = NULL;
        int count = 0;
        for(;;){
   
                int m;
                int res = scanf("%d",&m);
                // 输入结束会返回EOF,为Ctrl+z 或者Ctrl+d
                if(EOF == res) break;
                /*
                if(count == 0){
                        arr = calloc(1,sizeof(int));
                }else{
                        arr = realloc(arr,sizeof(int)*(count+1));
                }
                */
                // 当 arr == NULL 时,realloc() 相当于 malloc()
                arr = realloc(arr,sizeof(int)*(count+1));
                arr[count] = m;
                ++count;
        }

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

        free(arr);
        arr = NULL;
}

结果为:

1 2 3 4 5 6
7 6 5 4 3 2
1 2 3
1 2 3 4 5 6 7 6 5 4 3 2 1 2 3 

3. 数组的整体拷贝、比较、移动

函数 含义
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值