动态开辟字符串

本文介绍了如何在C语言中动态分配和管理字符串内存,包括malloc用于初次分配、realloc用于内存扩展、free释放内存以防止内存泄漏,以及memset用于字符串初始化。同时提到了strcpy函数的使用。
摘要由CSDN通过智能技术生成

动态开辟字符串有以下几个注意点:

1.应对字符串分配所需的内存空间------malloc

2.字符串分配到的内存空间不够时,应对内存空间进行扩容------realloc

3.多次运用到同一个字符串,则前面给字符串分配的空间应释放,防止内存泄漏------free

4.对字符串进行初始化------memset

malloc:函数原型是 void *malloc(size_t size)(size_t=unsigned int),C库函数 void *malloc(size_t size)分配所需的内存空间,并返回一个指向它的指针。代码展示:

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

int main()
{
	char *a;//野指针
	char *b;
	char *c;

	a=(char*)malloc(1);//开辟1字节的内存空间,有了具体的内存指向
	*a='a';	
	
	b=(char*)malloc(15);//开辟15字节的内存空间,有了具体的内存指向
	b="zhenglaoshinb";

    c=(char*)malloc(15);
	strcpy(c,"zhenglaoshinb");//运用最后一个copy函数,将后面的字符串copy到c中
	
	printf("%c\n",*a);
	puts(b);//输出字符串不需要“”
    puts(c);

	return 0;
}

realloc:函数原型是void *realloc(void *ptr, size_t size),C库函数 void *realloc(void *ptr, size_t size)尝试重新调整之前调用malloc或calloc 所分配的ptr所指向的内存块的大小。代码展示:

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

int main()
{
	char *a;
	
	a=(char*)malloc(5);
	int len=strlen("zhenglaoshinb");//计算数组总长度
	int newlen=len-5;//计算出去5字节以外的剩余长度
	a=realloc(a,newlen);//给a扩容
	strcpy(a,"zhenglaoshinb");
	
	puts(a);
	
	return 0;
}

free:函数原型是void free(void *ptr),C库函数void ree(void *ptr)释放之前调用calloc、malloc或realloc 所分配的内存空间。

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

int main()
{
	char *a;//野指针
	
	a=(char*)malloc(1);//a有具体的内存指向
	*a='a';	
	
	free(a);//使a重新变为野指针,防止内存泄露
	a=NULL;//free之后让指针指向NULL,防止悬挂指针(用完free就得定义,需养成习惯)
	
	a=(char*)malloc(15);//a重新有具体的内存指向
	strcpy(a,"zhenglaoshinb");
	
	puts(a);

	return 0;
}

memest:函数原型是 void *memset(void *str,int c,size_tn),这里主要用于字符串的初始化,括号里面分别是原先定义的数组、初始化结果和字节内存空间大小。代码展示:

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

int main()
{
	char *a;
	
	a=(char*)malloc(1);//a具有1个字节的内存指向
	*a='a';
	free(a);//使a重新变为野指针,防止内存泄露
	a=NULL;//free之后让指针指向NULL,防止悬挂指针(用完free就得定义,需养成习惯)
	a=(char*)malloc(12);//a具有12个字节的内存指向
	if(a==NULL)//通常养成习惯对malloc返回值做NULL判断,如果指向NULL,程序终止
	{
		printf("malloc error\n");
		exit(-1);
	}
	memset(a,'\0',12);//初始化字符串,全部为'\0'
	strcpy(a,"zhenglaoshinb");
	
	puts(a);
	
	return 0;
}

*strcpy:函数原型char *strcpy(char* dest, const char *src),前面是拷贝最终地址,后面的拷贝的源头地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值