C语言几个申请地址空间的函数

1、void * malloc(unsigned int size)

malloc为动态内存分配,申请一块连续指定大小的内存块区域以void*类型返回分配的内存区域地址;

  1. 函数头文件:#include
  2. 申请得到的为连续的存储空间,如果分配失败,则返回一个空指针(NULL)
  3. 返回的指针类型:void*(未确定类型的指针),也为空间首地址
  4. 函数参数为指定的字节数
  5. 最后用free()函数释放内存(free释放内存问题)
  6. malloc(0)属于合法语句,它能返回一个合法的指针(有一说法是,当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块)
#include
#include

void main()
{
     
	char *p;
	p = (char*)malloc(100*sizeof(char));    //sizeof获取字节数
	if(p==NULL)exit(-1);                    //如果分配空间失败,0为正常退出,其他为非正常退出
	printf("输入一串字符:");
	scanf("%s",p);
	printf("\n输出:%s\n",p);
	free(p);
	p = NULL;
}

2、void *realloc(void *ptr, size_t size);

指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),首先判断ptr指向的区域是否有足够的空间,如果有,则增大(或减少)该内存区域,然后将ptr返回;如果ptr指向的区域没有足够的空间,则分配一段新的内存区域,并且将原ptr的数据拷贝到新的内存区域,释放ptr指向的内存区域(内部完成,不需要外部使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址

  1. 函数头文件:#include
  2. 改变的区域可以比旧内存区域大或小
  3. 如果分配失败,则返回空指针NULL,原来的指针仍然有效(此时ptr所指的旧内存区域并没有被释放,需要用free函数释放这一部分内存,因此不能直接赋值给ptr,这样将导致ptr指针变为空指针,使旧内存区域无法得到释放 )
char* Dilatation(char* p,int n)
{
     
	char* q;
	q = (char*)realloc(p,n*sizeof(char));
	if(!q)
	{
     
		free(p);                            //如果返回为空指针,则释放原来的旧地址内存
	}
	return q;
}

3、void* calloc(unsigned int num,unsigned int size)

在内存的动态存储区中分配num个长度为size的连续空间;
注意:num:对象个数,size:对象占据的内存字节数,相较于malloc函数,calloc函数会自动将内存初始化为0

#include
#include

 
int main()
{
     
    char*str = NULL;
    str = (char*)calloc(10,sizeof(char));
    printf("String is %s\n",str);
	free(str);
    return 0;
}

你可能感兴趣的:(指针,数据结构,内存管理,malloc)