c语言中不能对字符指针变量指向的字符再赋值的问题

这个一个关于两个爪子的问题 ‘’’’’

话题引出

我跟随翁凯教授的c语言进阶教程完成strcpy函数的创建,s1和s2字符串都使用了字符串指针创建

char *s1="hell";
char *s2="world";

但在赋值环节出现了内存访问报错的问题
在这里插入图片描述

代码如下

void mystrcat(char *s1,char *s2){
int i1=0;
while (s1[i1]!='\0')
{
    i1++;
}
int i2=0;
while (s2[i2]!='\0')
{
    s1[i1]=s2[i2];
    i1++;
    i2++;
}
s1[i1]='\0';
}

调试发现是在
**s1[i1]=s2[i2]**这里报错,查询资料后得知

C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。

什么意思?我给你翻译翻译

就是我们使用 char *s1=“hello” 创建s1字符串的时候,是在操作系统中随机一个地方把hello这个东西当做 常量来定义,然后把地址交给s1,注意这里"hello"是常量,常量你还想怎么改

而另一种方式创建字符串后使用同一段代码却正常

char s1[]="hello";
char s2[]="world";

Why?

char s1[]=“hello”;
这样赋值的就是一个字符数组。s1[]是使用了数组的方式,在内存中开辟了指定的内存空间来存放这个字符串

tip:

1.数组的变量名=a[0]的地址
2.指针也可以创建字符串,也可以当数组使用,当要注意这是一个
只读常量

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值