各位c语言大佬帮忙看一下这个程序哪里有问题?

#include<stdio.h>intmain(void){voidcop(char*a,char*b);char*from="Ilovechina";char*to=... # include<stdio.h>

int main(void)
{
void cop(char *a,char *b);
char *from="I love china";
char *to="I am a student";

printf("string from=%s\nstring to=%s\n",from,to); //输出字符串

cop(from,to); //调用cop函数把from中的字符逐个复制到to中
printf("string to=%s",to); //输出复制后的字符串

return 0;
}

void cop(char *a,char *b)
{
for (;*a!='\0';a++,b++)
*b=*a;
*b='\0';
}
把char *to="I am a student";改成char arr[]="I am a student";char *to=arr;程序就没问题了,这是为啥?
展开
 我来答
GTA小鸡
高粉答主

2019-08-12 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.3亿
展开全部

字符串字面值常量不可以修改。而字符数组可以修改。

养成将字符串字面值常量声明为const的好习惯,可以避免你犯这样的错误,因为试图修改会在编译时就报错。

const char *from="I love china";  // 字符串字面值常量不可以修改,声明为const

char from[]="I love china";  //字符数组可以修改

更多追问追答
追问

我这里from和to是指针变量呀,为什么是常量。在后面cop函数的定义里面是让形参a,b作自加,也就是指针进行的自加,没有对常量进行修改,而且他也没报错,但是cop函数没结果。像下图把“I am a student”赋给字符数组arr[],再把arr赋给to他是可以完成的。可是不管是直接

char *to="I am a student";

还是

char arr[]="I am a student";

char *to=arr;

他们两不都是把字符串的初始地址赋给指针变量to吗?搞不懂。

追答
用双引号引起来的内容,就叫做字符串字面值常量。"I am a student"就是一个字符串字面值常量。
char *to="I am a student"; 定义一个指针to,令它指向字符串字面值常量"I am a student"的首地址。这种写法是不规范的,因为用户可以通过指针to修改其指向的内容,这违背了字符串字面值常量不可修改的原则,可能导致程序运行时异常(也就是你的程序崩溃的原因)。因此,规范的写法应该是const char *to="I am a student"; 将指针to定义为常量指针,杜绝了用户通过该指针修改其所指内容的可能性。
匿名用户
2019-08-12
展开全部
你的代码在vc++6.0中可以运行;在vs2017中提示要加const,估计与c11标准有关
更多追问追答
追问
我刚开始学,c11要求了我就照着做吧,但是现在的问题和c11没什么关系,在VC++6.0都没搞懂的问题。
追答
我建议你加const,c语言二级辅导书里面说不加const合法.(在vc++6.0中的确是这样)但在vs2017中,必须加const,因为char *a="wwww";这里wwww的类型是const char *类型.就会报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式