动态内存开辟(malloccallocrealloc)

xiaoxiao2021-02-28  103

1.定义:

需从堆上开辟空间使用,开辟成功后由指针进行空间的运用。

2.malloc函数

a.函数原型:void *malloc( size_t size );

b.例

//动态开辟10个整型连续单元 int* p=(int *)malloc(10*sizeof(int)); if(p==NULL) { printf("%s\n",strerror(errno)); exit(1); } //使用....... free(p); p=NULL; //动态开辟100个char型连续单元 char* cp=(char*)malloc(100*sizeof(char)); if(cp==NULL) { printf("%s\n",strerror(errno)); exit(1); } //使用....... free(cp); cp=NULL; //动态开辟10个结构体连续单元 typedef struct Stu { int i; float f; }stu; stu* s=(stu*)maloc(10*sizeof(stu)); if(s==NULL) { printf("%s\n",strerror(errno)); exit(1); } //使用....... free(s); s=NULL;

c.注意

@1:返回的是开辟空间的首地址

@2:原则上开辟后的空间返回地址类型为void*型,在我们实际用时常常要用强转,故灵活性强

@3:不仅能开辟常用类型(int char double等),还能开辟组合类型(结构体等)

@4:申请不一定成功,该函数申请失败返回NULL,故判断空间指向指针为NULL是申请不成功,不能使用

@5:使用完要返还给内存,用free函数

@6:即使我们用了free函数将指针所指向空间释放了,但是指针还保留有开辟空间的起始地址,当我们进行解引用时,就会产生指针所指空间不属于自己,但我们去使用了,导致一些未知性错误(free后指针置NULL)

@7:动开辟的空间是连续的,同数组一样使用,都要防止越界访问

void test() { int* p=(int *)malloc(10*sizeof(int)); int i=0; if(p==NULL) { printf("%s\n",strerror(errno)); exit(1); } for(i=0;i<10;i++) { *(p+i)=i; } free(p); p=NULL; }

3,calloc函数

a,函数原型:void *calloc( size_t num, size_t size );

b,例

int* p=(int *)calloc(10,sizeof(int)); char* cp=(char*)=calloc(100,sizeof(char));

c,注意

@1:malloc函数注意点它也同样适用

@2:该函数开辟的空间中元素全部置0(相当于初始化为0)

4,realloc函数

a, 函数原型:void *realloc( void *memblock, size_t size );

b,例

int* p=(int*)malloc(10*sizeof(int)); int *newp=NULL; newp=(int*)realloc(p,20*sizeof); if(newp==NULL) { printf("%s\n",strerror(errno)); exit(1); } p=newp; //使用..... free(p); p=NULL;

c.注意

@1:malloc函数注意点它也同样适用

@2:realloc函数可扩可缩

@3:realloc函数在扩大空间时,保留原来空间中的数据,在缩小时,会将尾部的数据舍弃

@4:扩大空间的2种情况:

转载请注明原文地址: https://www.6miu.com/read-73011.html

最新回复(0)