动态开辟字符串有以下几个注意点:
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),前面是拷贝最终地址,后面的拷贝的源头地址。