中易网

C语言中关于字符串指针常量的问题

答案:5  悬赏:40  
解决时间 2021-12-30 14:58
#include<stdio.h>
#include<stdlib.h>
void main()
{
char *p = "123456";
char *s = "asdghh";
*s = *p;
}

问题:运行时会报错,实际上就是说指针 p和s 所指向的内存是只读的,但是不可以写;改为如下就是正确的了:
{
char a[]="123456";
char *p = a;
char a1[]="asdghh";
char *s =a1;
*s = *p;
}
此时,指针 p和s 所指向的内存是可读可写的!!!!

请高手解释下,谢谢!!!
最佳答案
第一个:char *p = "123456";
char *s = "asdghh";
*s = *p;
你这个之所以会错,是因为指针s指向的是常量字符串 asdghh 而*s=*p相当于改变常量字符串的值,常量是不能改变的,而且常量也不能做左值,所以出错。
第二个:
char a[]="123456";//这个的意思是 在内存充开辟空间 把常量字符串复制到这个空间
char *p = a;//这个说明指针p存储的是数组变量a的地址
char a1[]="asdghh"; //同上
char *s =a1; //同上
*s = *p; // 这句的意思是 把指针p所指向空间的值(这里为数组a)复制到指针s所指向的空间(这里为数组a1)
全部回答
首先请明确一点:指针也是变量, 只不过编译器解析该变量时将它的内容看作地址去访问内存. 其次请明确应,程序分为不同的段,包括代码段、数据段等。 类似“hello”这类的变量实际是常量字符串,位於程序的代码段,char *ptr="hello表示定义字符指针ptr、并将字符串“hello”的首地址赋值给ptr,如此便可通过ptr引用“hello”,当然是只读引用了。(注意和char ptr[] = "hello"区分,後者定义了一个字符数组ptr)
在第一个中: void main() { char *p = "123456"; char *s = "asdghh"; *s = *p; } 语句 *s = "asdghh"; 定义了一个指针变量s,它指向静态存储区的常量区(常量区的内容不可被修改)。所以运行时*s = *p; 你试图改变常量区的内容时,系统会报错。 同理,若执行语句*p = *s; 会报同样的错。 在后面该正确的代码中: { char a[]="123456"; char *p = a; char a1[]="asdghh"; char *s =a1; *s = *p; } 也就是说这两句话运行正确: char *s =a1; *s = *p; 原因:char a1[]="asdghh"; 实际上相当于 char a1[7]={'a','s','d','g','h','h','\0',}; 编译时 系统会在堆栈区里分配连续的7*sizeof(char)的空间,并将首地址传给数组a1. 所以char *s =a1; 即字符指针变量s同样指向上述的空间首地址, *s=*p同样可以运行。 综上所述二者的本质区别在: 前者char *s = "asdghh"; 中的字符串存于常量区,不可写 后者char a1[]="asdghh"; 中的字符串存于堆栈区,和普通的变量一样,可读写
#include<stdio.h> 是你的指针用的不对,不是可读不可读的问题 #include<stdlib.h> void main() { char *p = "123456"; char *s = "asdghh"; s = p; printf(s); }
char a1[]="asdghh";实际上相当于char a1[7]="asdghh"; 定义了一个长度为7的字符数组,注意,这个数组是你自己定义的,所以你能修改它的值。 而char *p = "123456";则仅仅是声明了一个指针变量,这个变量指向了一个常量字符串"123456",而常量字符串的值是不允许修改的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
金斷的意思是什么?金斷的释义是什么啊?
宏碁4745g能不能装w10系统
如果我每年放1万入股市 假设股市每年收益是百
作文历史名人态度改变命运
走动的意思是什么啊?请解释下!
景光的意思是什么?景光的释义是什么啊?
甘肃2017年对口升学报名入口
what do sb.look like?与what be sb. like?有
元谋到昆明的交通?
有人说话很难听说我是不是急着要去献身,我该
戴美瞳眼睛有雾感
伏戲的意思是什么?伏戲的释义是什么啊?
腿上有鸡皮肤怎么办啊,腿上有鸡皮肤怎么办啊
丰润汽车站有直达承德隆化的车吗?时间及票价
琤琮的意思是什么啊?请解释下!
推荐资讯
小量的意思是什么?小量的释义是什么啊?
吃饭哽咽怎么回事
什么是许诺销售?
oppo手机卖不好怎么总结
嗟痛的意思是什么啊?请解释下!
上海广缘大酒店怎么去啊,有事要去办理
余牲的意思是什么啊?请解释下!
沾化区泊头工商所地址在哪,我要去那里办事
紗帳的意思是什么?紗帳的释义是什么啊?
宋锦的意思是什么?宋锦的释义是什么啊?
你认为迄今为止最有害的一项发明英语作文
我是不是该安静的走开mp3郭富城高潮
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?