动态内存开辟与柔性数组详解

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函数

  1. 后面空间足够 ,则返回原来的初始地址
#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;

四、柔性数组

特点

  1. 在柔性数组上面至少有一个成员存在
  2. 在使用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;

以上是关于动态内存开辟与柔性数组详解的主要内容,如果未能解决你的问题,请参考以下文章

动态开辟内存的这些知识你知道了吗?了解柔性数组吗?超详细画图以及文字讲解,干货满满

C语言进阶—— 动态内存开辟+柔性数组

剖析C动态内存管理 (malloc,calloc,realloc,柔性数组)

动态内存管理

C语言篇 + 内存管理及柔性数组话题

剖析c语言动态内存管理