动态内存开辟与柔性数组详解
Posted 萌新的日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存开辟与柔性数组详解相关的知识,希望对你有一定的参考价值。
(文章目录)
一、动态内存函数
1.malloc函数
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malooc(10*sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<10;i++)
*(p+i)=i;
free(p);
p=NULL;
return 0;
2.calloc函数
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<,10;i++)
printf("%d\\n",*(p+i));//malloc没有初始化 全为随机值
free(p);
p=NULL;
return 0;
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)calloc(10,sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<10;i++)
printf("%d\\n",*(p+i));//calloc可以初始化 全是0
free(p);
p=NULL;
return 0;
3.realloc函数
- 后面空间足够 ,则返回原来的初始地址
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<10;i++)
*(p+i)=i;
int*str=(int*)realloc(p,20*sizeof(int));//正常来说只要返回到p就可以了 但是要考虑到 为NULL时的情况 free(NULL)就什么都不做了 会造成内存泄漏
if(str!=NULL)
p=str;
free(p);
p=NULL;
return 0;
二、常见动态内存错误
1.对NULL的解引用操作
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int);
int i=0;
for(i=0;i<0;i++)
*(p+i)=i;//如果开辟失败返回NULL *NULL会报错
free(p);
p=NULL;
return 0;
2.对动态空间的越界访问
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<40;i++)
*(p+i)=i;//开辟10个整数空间 想要访问40个整形 会造成越界访问
free(p);
p=NULL;
return 0;
3.对非动态内存使用free释放
#include<stdio.h>
#include<stdlib.h>
int main()
int arr[10]=0;
int *p=arr;//arr是首元素地址 是在栈区上的
free(p);//动态内存 是在堆区上的 free栈区的会报错
p=NULL;
return 0;
4.使用free释放一块动态内存开辟的一部分
#inlcude<stdio.h>
#inlcude<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int));
if(p!=NULL)
int i=0;
for(i=0;i<10;i++)
*p++=i;//p指针本身向后移动 free释放掉p现在所在后面的空间 会造成内存泄漏
free(p);
p=NULL;
return 0;
5.对同一块内存的多次释放
#include<stdio.h>
#include<stdlib.h>
int main()
int*p=(int*)malloc(10*sizeof(int));
free(p);
//p=NULL;
free(p);
//p=NULL;
return 0;
6.动态开辟的空间忘记释放
#include<stdio.h>
#include<stdlib.h>
void test()
int*p=(int*)malloc(10*sizeof(int));
//free(p);
int main()
test();
return 0;
三、笔试题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void memoey(char*p)
p=(char*)malloc(100);
int main()
char*str=NULL;
memory(str);
strcpy(str,"hello world");
printf(str);
return 0;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void memoey(char**p)
*p=(char*)malloc(100);
int main()
char*str=NULL;
memory(&str);
strcpy(str,"hello world");
printf(str);
return 0;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*memory()
char p[]="hello world";
return p;
void test()
char*str=NULL;
str=memory();
printf(str);
int main()
test();
return 0;
四、柔性数组
特点
- 在柔性数组上面至少有一个成员存在
- 在使用sizeof计算大小时 不包括柔性数组的内存
#include<stdio.h>
struct S
int n;
int arr[];//一个未知大小的数组 --柔性数组
int main()
struct S s=0;
printf("%d\\n",sizeof(s));//4
#include<stdio.h>
#include<stdlib.h>
struct S
int n;
int arr[];//期望柔性数组大小是10个整形
int main()
strcut S*p=(struct S*)malloc(sizeof(s)+10*sizeof(int));
free(p);
p=NULL;
return 0;
以上是关于动态内存开辟与柔性数组详解的主要内容,如果未能解决你的问题,请参考以下文章
动态开辟内存的这些知识你知道了吗?了解柔性数组吗?超详细画图以及文字讲解,干货满满