malloc();calloc();realloc()

1.malloc:动态分配内存

原型:void *malloc(size_t size);

功能:在内存中动态分配size大小个空间(一般在堆中分配),返回值是void*(可以和任何类型指针兼容),若成功返回开辟内存首地址;分配不成功返回NULL;

用法:一般使用后要使用free(起始地址的指针)对内存进行释放,

头文件:stdlib.h或malloc.h

注意:这里申请到的空间不一定为0,可能有上一次的垃圾数据,一般申请后做一步清0操作,避免出现乱码。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

例子:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
int main()
{
	char*str = NULL;

	str = (char*)malloc(sizeof(char*10));	//分配内空间
	bzero(str,0);				//清0
	strcpy(str, "Hello");			//将hello写入
	printf("String is %s\n",str);		//显示变量内容
	free(str);				//释放空间

	return 0;
}

2.calloc:动态内存分配并清零

原型:void *calloc(size_t n, size_t size);

功能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

用法:一般使用后要使用 free(起始地址的指针)对内存进行释放,不然内存申请过多会影响计算机的性能,以至于得重启电脑。如果使用过后不清零,还可以使用指针对该块内存进行访问。

头文件:stdlib.h或malloc.h

注意:这里申请到的空间被自动清0;与malloc不同;

例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char*str = NULL; 

    str = (char*)calloc(10,sizeof(char));   //分配内存空间
    strcpy(str, "Hello");                   //将hello写入
    printf("String is %s\n",str);           //显示变量内容
    free(str);                              //释放空间

    return 0;
}

3.realloc:动态内存调整

原型:void *realloc(void *mem_address, unsigned int newsize);

功能:调整内存大小,mem_address为原有地址的起始地址,newsize为调整后的大小

用法:也需要与free配合使用,返回值返回重新非配后的起始地址,失败返回NULL

头文件:stdlib.h

注意:这里所说的是调整内存而不是分配,在原来开辟的内存上进行修改,若调整的内存大于原有内存,则会将原有内存拷贝过去,若调整内存小于原有内存,那么数据可能会丢失

例子:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i;
    
    int*pn=(int*)malloc(5*sizeof(int));     //申请5个空间
    printf("malloc%p\n",pn);                //打印地址

    for(i=0;i<5;i++) pn[i]=i;               //分别赋值
    pn=(int*)realloc(pn,10*sizeof(int));    //调整空间大小
    printf("realloc%p\n",pn);               //打印地址
    for(i=5;i<10;i++) pn[i]=i;              //扩展的空间赋值
   
    for(i=0;i<10;i++) printf("%3d",pn[i]);  //打印数据
    
    printf("\n");
    free(pn);                               //释放内存
    return 0;
}



   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值