动态分配内存
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. 数组的整体拷贝、比较、移动
函数 | 含义 |
---|