君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,之前写了一篇有关数据结构顺序表的文章,中间引用了大量的动态内存开辟的知识,今天就来带大家详细了解一
勤时当勉励 岁月不待人
Hello,米娜桑们,这里是君兮_,之前写了一篇有关数据结构顺序表的文章,中间引用了大量的动态内存开辟的知识,今天就来带大家详细了解一下动态内存管理这部分非常重要的知识,保证大家看了后都会对这部分有一个更加深刻的理解!
好了,废话不多说,开始今天的学习吧!
int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
void* malloc (size_t size);
如果参数 size 为0,也就是开辟一块空间大小为0的空间,malloc的这种行为是标准是未定义的,取决于编译器。
void free (void* ptr);
#include #include int main(){ //int arr[10]; int* p = (int*)malloc(40);//开辟40个字节的整形空间,把返回的开辟好空间的起始地址保存在p中 if (p == NULL)//判断malloc开辟内存是否成功 { perror("malloc");//如果没成功,通过perror来报错 return 1; } //开辟成功 int i = 0; for (i = 0; i < 10; i++) { printf("%d\n", *(p + i));//打印一下此时p中空间存储的内容 } free(p);//用完后释放空间,把开辟的空间返回给操作系统 p = NULL;//将p置空 return 0; }
除了注释中提到的点,还有以下几个值得注意的问题:
C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。原型如下:
void* calloc (size_t num, size_t size);
#include #include int main(){int *p = (int*)calloc(10, sizeof(int));if(NULL != p){//使用空间}free(p);p = NULL;return 0;}
void* realloc (void* ptr, size_t size);
扩展内存直接在原有内存之后直接追加空间,原来空间的数据不发生变化。
#include int main(){ int* ptr = (int*)malloc(100); if (ptr != NULL) { //业务处理 } else { exit(EXIT_FAILURE); } //扩展容量 //代码1 ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?) //代码2 int* p = NULL; p = realloc(ptr, 1000); if (p != NULL) { ptr = p; } //业务处理 free(ptr); return 0;}
void test(){int *p = (int *)malloc(INT_MAX/4);*p = 20;//如果p的值是NULL,就会有问题free(p);}
void test(){ int i = 0; int* p = (int*)malloc(10 * sizeof(int)); if (NULL == p) { exit(EXIT_FAILURE); } for (i = 0; i <= 10; i++) { *(p + i) = i;//当i是10的时候越界访问 } free(p);}
void test(){int a = 10;int *p = &a;free(p);//ok?}
void test(){int *p = (int *)malloc(100);p++;free(p);//p不再指向动态内存的起始位置}
#include #include int main() { // 分配动态内存 char* ptr = malloc(10); // 检查内存是否成功分配 if (ptr == NULL) { // 处理内存分配失败的情况 return 1; } // 复制数据到新的内存块 char* newPtr = malloc(5); memcpy(newPtr, ptr, 5); // 释放原始的内存块 free(ptr); // 使用新的内存块进行操作 // 释放新的内存块 free(newPtr); return 0;}
void test(){int *p = (int *)malloc(100);free(p);free(p);//重复释放}
void test(){int *p = (int *)malloc(100);if(NULL != p){*p = 20;}}int main(){test();while(1);}
今天的内容到这里就结束了,动态内存管理的基本知识点都在这里了,如果你能把上面的内容都学会的话,那么你就掌握了动态内存管理中的大部分内容,之后我们在为大家讲解几个有关的面试题加深大家的理解并且在介绍一下有关柔性数组的知识。
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**
来源地址:https://blog.csdn.net/syf666250/article/details/132047098
--结束END--
本文标题: 【C语言进阶】那些你必须掌握的C/C++要点——动态内存管理(1)
本文链接: https://www.lsjlt.com/news/376591.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0