本文共 3209 字,大约阅读时间需要 10 分钟。
如上我们已学的开辟空间的方式有两个特点:
(1) 空间开辟的大小是固定的 (2) 必须指定数组的长度 所以就产生了空间开大了浪费开小了不够用的问题,所以使用动态内存分配#define _CRT_SECURE_NO_WARNINGS#include#include #include int main(){ //向内存申请10个整形的空间 int* p = (int*)malloc(10 * sizeof(int)); //开辟空间失败,打印失败原因 if (p == NULL) { //errno:Last error number printf("%s\n", strerror(errno)); } //开辟空间成功,将0-9放入 else { for (int i = 0; i < 10; i++) { *(p + i) = i; } for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); } } //释放掉p指向的这段空间,但是指针p还是指向这段空间 free(p); //防止野指针,需要将指针制空 p = NULL; return 0;}
• INT_MAX 整形最大–>可右键转到定义查看
#define _CRT_SECURE_NO_WARNINGS#include#include #include int main(){ //向内存申请10个整形的空间 int* p = (int*)malloc(INT_MAX); //开辟空间失败,打印失败原因 if (p == NULL) { //errno:Last error number printf("%s\n", strerror(errno)); } //开辟空间成功,将0-9放入 else { for (int i = 0; i < 10; i++) { *(p + i) = i; } for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); } } //释放掉p指向的这段空间,但是指针p还是指向这段空间 free(p); //防止野指针,需要将指针制空 p = NULL; return 0;}
#include#include #include int main(){ int* p = (int*)calloc(10, sizeof(int)); if (p == NULL) { printf("%s\n", strerror(errno)); } else { for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); } } free(p); p = NULL; return 0;}
如果p指向的空间之后有足够的内存空间可以追加,则直接追加,然后返回p
#include#include #include int main(){ int* p = (int*)malloc(20); if (p == NULL) { printf("%s\n", strerror(errno)); } else { for (int i = 0; i < 5; i++) { *(p + i) = i; } } //得用一个新的变量来接受realloc函数的返回值 //防止开辟失败返回NULL给p找不到之前的空间 int*ptr = (int*)realloc(p,40); if (ptr != NULL) { p = ptr; for (int i = 5; i < 10; i++) { *(p + i) = i; } for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); } } free(p); p = NULL; return 0;}
如果p指向的空间之后没有足够大的内存空间可以追加,则realloc函数会重新找一块新的内存区域,开辟一块满足需求的空间,并把原来内存中的数据拷贝到新的空间,释放旧的内存空间,最后返回新开辟的内存空间地址
#include#include #include int main(){ int* p = (int*)malloc(20); if (p == NULL) { printf("%s\n", strerror(errno)); } else { for (int i = 0; i < 5; i++) { *(p + i) = i; } } //得用一个新的变量来接受realloc函数的返回值 //防止开辟失败返回NULL给p找不到之前的空间 int*ptr = (int*)realloc(p,4000); if (ptr != NULL) { p = ptr; for (int i = 5; i < 10; i++) { *(p + i) = i; } for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); } } free(p); p = NULL; return 0;}
注意:得用一个新的变量来接受realloc函数的返回值,防止开辟失败返回NULL给p找不到之前的空间
转载地址:http://kpdz.baihongyu.com/