动态开辟字符串

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

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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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 
#include 
#include 

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),前面是拷贝最终地址,后面的拷贝的源头地址。

你可能感兴趣的:(算法,c#)