一个关于指针的问题 int main() { char * p="123431"; *p='A'; //printf("%c\n",p); return 0; }

这个函数存在什么问题,望高手指教!!!... 这个函数存在什么问题,望高手指教!!! 展开
 我来答
wangjing_bit
2011-02-25 · 超过10用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:0
展开全部
编译就不能够通过。
问题出在毁启 char* p = "123431";和printf("%c\n", p);
"123431"是个字符串常量,指向它的指针是const char*,所以这条语句其实是:
char* p = (const char*)"123431"; 将一个const变量赋值给非const,编译会出错。当然你可以使用char* p = const_cast<char*>("123431");对字符串进行强行转为非const类型,但是后面的printf("%c\n",p); 也会编译出错,纤液如因为p是char*类型,应该改为printf("%s\n",p)。之后能够编译通过,但是执行时会core掉,因为这里对内存有一个非法操作。字符串常量放在了埋团程序的初始化数据段,这里的内存是不能修改的,因此修改操作导致程序崩溃。
追问
char* p = "123431";这句话显然是没有问题的。可不知道为什么*p='A'不能成功,而p='A'可以成功只是有警告。能否帮我详细解释一下初始化数据段是怎么回事,在内存的什么区里。因为我们老师说,'A'和'123431‘不在一个区,'A'是找不到p的地址的,因此不能在该区赋值。他也说了p指针是只读的,所以希望你能帮我讲的详细一点。谢谢~
追答
1.关于char* p = "123431"的问题。如果把报警都打开,并且任何报警都是错误的话,那会编译不通过的,如Linux下增加编译项-Werror;
2.可以抛开初始化数据段这个概念,简单点说就是:char* p="123431"这句话,涉及到一个字符串"123431",这个字符串你并没有分配内存来存储它,只是用了一个指针来指向它。这个字符串的内存一般都是由编译器在编译的时候就指定好了,将它在程序初始化的时候分配到全部存储为常量的内存中(操作系统不同,名字可能不同),是只读的。如果程序运行过程中,企图修改这块内存中的数据,将出错;
3.关于char* p = 'A'的问题。其实类似与int p='A',这个命令就是将p值负值为'A'的ASCII码值,同理char* p='A'其实也是一样,数据存储在char* p分配的指针的内存中。报警的原因,是类型强转,可能导致数据丢失。如果在函数内使用char* p='A',则使用栈存储;如果是全局,则使用数据段存储;
寻平阳
2011-02-25 · TA获得超过1525个赞
知道小有建树答主
回答量:1235
采纳率:0%
帮助的人:1048万
展开全部
char * p="闷裤123431";
//这样定义时,只是定义了一个字符指针p,并没有给p赋值
//虽然*p=="123431",但你并不知道枣野*p在哪,就是说p是不固定的。
//如果使用p,不给p赋值,就不知道p指向哪块内存区域,所以给*p赋值是不正确的。
可以这样:
//char * p;之后这样
p=new char[10];//当然这样用完p之后的蚂岩简delete p:
//或者这样
char str[10]; p=str;
然后就可以*p=‘A’了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
htht1325
2011-02-25 · TA获得超过581个赞
知道答主
回答量:303
采纳率:0%
帮助的人:160万
展开全部
这个程序主要是那个*p='A'有问题,这里p是指向字符串"123431"的森侍兄指针,它存储的是字符串谈燃的首地址,*p代表的是第一个字符串,不能对其进行赋值,因为它不此袭是代表一个变量,所以不能赋值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bingdele
2011-02-26 · TA获得超过745个赞
知道小有建树答主
回答量:366
采纳率:83%
帮助的人:219万
展开全部
p是字符串常量,迅拆一般编译器会把它存放在内存姿纤的只读区域,而*p = A是相当于对只读的区域重新赋值,可以这样理解如果改为迹昌仿p【】 = “123431”; p【0】 = 'A';没问题了就
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式