C语言:动态开辟字符串实战

        我们都知道,在计算机编程中,字符串是一种基本且广泛使用的数据类型,通常用于表示文本信息。然而,在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扩容后的空间地址,首地址不变

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值