我们都知道,在计算机编程中,字符串是一种基本且广泛使用的数据类型,通常用于表示文本信息。然而,在C语言以及其他一些低级编程语言中,预定义大小的字符数组(静态字符串)往往不能满足所有应用场景的需求。这时,动态开辟字符串的功能显得尤为重要。
那接下来我将使用代码来给大家详细讲解一下,malloc函数的使用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *p;//此时定义了一个指向字符型变量地址的指针p,但是没有指定具体的地址,此时是它是野指针
//*p='a';//因为p没有指向任何地址(它是野孩子),此时根据地址去赋值是错误的。
//malloc返回值是指针,也就是地址
p=(char *)malloc(1);//此时使用malloc给指针p创建了一个动态的空间,并且把地址给了指针p
*p='a';//因为此时指针p有了地址,就可以使用*p给地址传递一个值
printf("malloc给了野指针p一个家,家庭住址是:%p,\n",p);
printf("它就迫不及待往家里带回了一个婆娘,婆娘名叫:%c\n",*p);
return 0;
}
运行结果:
如果野孩子p又想带自己的丐帮小弟回家应该怎么办呢?家里只能呆一个人!!!
那就又要请到老兄malloc帮他把房子盖大一点:
int main(){
char *p;//此时定义了一个指向字符型变量地址的指针p,但是没有指定具体的地址,此时是它是野指针
//*p='a';//因为p没有指向任何地址(它是野孩子),此时根据地址去赋值是错误的。
//malloc返回值是指针,也就是地址
p=(char *)malloc(1);//此时使用malloc给指针p创建了一个动态的空间,并且把地址给了指针p
*p='a';//因为此时指针p有了地址,就可以使用*p给地址传递一个值
printf("malloc给了野指针p一个家,家庭住址是:%p,\n",p);
printf("它就迫不及待往家里带回了一个婆娘,婆娘名叫:%c\n",*p);
//用完后记得释放空间,也就是把p赶出家门,给别人腾空间
free(p);
//但是为了防止野孩子乱跑,蹲到别人家门口去,所以说要给他约束住
p=NULL;// 在释放内存后,应该将指针设置为NULL,以避免继续使用已释放的内存
//盖大房子
p=(char *)malloc(12);
printf("我们可以发现,盖得大房子地址是:%p\n",p);
return 0;
}
此时新房子是重新找了个地址盖得房子,并且此时能容纳12个人 了,但是p比较贪心,它的friends有很多人:
char str[]="What is a wild pointer123456789";
但是p觉得现在的家风水特别好,不想再换地址了,没办法,只能请来了realloc帮它扩建:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *p;//此时定义了一个指向字符型变量地址的指针p,但是没有指定具体的地址,此时是它是野指针
//*p='a';//因为p没有指向任何地址(它是野孩子),此时根据地址去赋值是错误的。
//malloc返回值是指针,也就是地址
p=(char *)malloc(1);//此时使用malloc给指针p创建了一个动态的空间,并且把地址给了指针p
*p='a';//因为此时指针p有了地址,就可以使用*p给地址传递一个值
printf("malloc给了野指针p一个家,家庭住址是:%p,\n",p);
printf("它就迫不及待往家里带回了一个婆娘,婆娘名叫:%c\n",*p);
//用完后记得释放空间,也就是把p赶出家门,给别人腾空间
free(p);
//但是为了防止野孩子乱跑,蹲到别人家门口去,所以说要给他约束住
p=NULL;// 在释放内存后,应该将指针设置为NULL,以避免继续使用已释放的内存:
//盖大房子
p=(char *)malloc(12);
printf("我们可以发现,盖得大房子地址是:%p\n",p);
char str[]="What is a wild pointer123456789";
printf("开始扩容空间,原来的地址是:%p\n",p);
int len=strlen(str);
int newLen=len-12+1;
realloc(p,newLen);
printf("扩容后的地址是:%p\n",p);
strcpy(p,str);
puts(p);
puts("--------------------------------");
return 0;
}
综上述实战,我们可以总结出这么几个点:
1、每一次动态开辟的空间地址是不一样的;
2、释放完指针地址后,要记得约束住它,让p=NULL;
3、如果传入的字符串长度超出动态定义的空间,容易溢出,越界等等问题出现
4、使用realloc扩容后的空间地址,首地址不变