c的基本知识

techhunter 2001-08-27 12:27:36
char * const a="abcde";
*a='k';

这段程序在多个编译器上都可以通过(vc,gcc)
但是运行时情况如下:
vc5可以正常进行
vc6和gcc出错

应该是与编译器相关,各位看法如何?
...全文
212 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2001-08-28
  • 打赏
  • 举报
回复
呵呵,这个语法是c++比较新的语法规则,所以一些以前的编译器不会有这个问题,而只有象vc++6。0这样比较新的编译器才会出现这种情况,以前有一个帖子就是讨论这个的。而且,在我们公司培训的时候,培训的老师(一个大家都会知道的人,尤其是你对com很感兴趣的话)也是这样说的。
vince_xu 2001-08-28
  • 打赏
  • 举报
回复
我看明白了,就是说比较新的编译器把下面的语句
char *p="a const pointer";
理解为:
const char *p="a const pointer";

当作规则来看好了。

同样的
char * const a="abcde";
在vc6这样新的编译器中被理解成为
const char * const a="abcde";
当然不能赋值了。
LANDFISH 2001-08-28
  • 打赏
  • 举报
回复
请问zhaoyao73(小赵):
*q='a'这一句和 const int有什么关系,可否解释一下?谢谢!
zhaoyao73 2001-08-28
  • 打赏
  • 举报
回复

char *p="a const pointer";
char q[]="a char array";

p 指向静态区,

q动态分配一定内容,然后将“a char array"拷过去,

*q='a';当然无问题

*p='a';当然出错
//*p='a'; //若有此句,运行时会出错。
*q='b'; //这里没有问题

出现警告,是转化为const int的原因,加强制转换ok
LANDFISH 2001-08-28
  • 打赏
  • 举报
回复
请问liu_feng_fly(一只菜鸟,忽忽悠悠的就飞来了!!) :
为什么编译的时候会出现上面的警告呢?按理说应该完全没问题才对阿。我用的编译器是vc6
谢谢!
emailcdh 2001-08-28
  • 打赏
  • 举报
回复
有意思,gz
natureshuo 2001-08-27
  • 打赏
  • 举报
回复
char *str="world";// 非const指针,非const数据
const char *str="world";// 非const指针,const数据
char * const str="world";// const指针,非const数据
const char * const str="world";// const指针,const数据

肯定是编译器造成的,vc6和gcc一定是理解 " *a='k'; " 为把地址也指向'k'.
所以编译出错
assassinator 2001-08-27
  • 打赏
  • 举报
回复
a是指向代码段的,操作系统保护代码段内存为只读内存
liu_feng_fly 2001-08-27
  • 打赏
  • 举报
回复
这里的"abcde"被认为是常量
iamxia 2001-08-27
  • 打赏
  • 举报
回复
呵呵,VC正常,那么a的结果是什么?
tjm 2001-08-27
  • 打赏
  • 举报
回复
gz
charlyisme 2001-08-27
  • 打赏
  • 举报
回复
gz
LANDFISH 2001-08-27
  • 打赏
  • 举报
回复
但是上面的程序会出现下面的警告,不知道为什么,那位高手可以解释一下?
C:\COMPUTER-STUDY\c++\Char_Pointer\Char_Pointer.cpp(13) : warning C4305: '=' : truncation from 'const int' to 'char'
C:\COMPUTER-STUDY\c++\Char_Pointer\Char_Pointer.cpp(13) : warning C4309: '=' : truncation of constant value
LANDFISH 2001-08-27
  • 打赏
  • 举报
回复
我试验了一下,代码如下:
char *p="a const pointer";
char q[]="a char array";
//*p='a'; //若有此句,运行时会出错。
*q='b'; //这里没有问题
cout<<p<<endl;
cout<<q<<endl;
记得csdn上曾经讨论过这个问题,结论好象是当编译器遇到这一句:char *p="a const pointer";时,会在常量内存区中分配一段内存给字符串"a const pointer",然后令p指向这一段内存区,即p指向的是一个常量字符串,试图改变p的内容,当然会导致错误啦,而char q[]="a char array";是在动态内存区分配空间的,所以q的内容是可变的。
roland_c 2001-08-27
  • 打赏
  • 举报
回复
试试*a="k"
MountLion 2001-08-27
  • 打赏
  • 举报
回复
To: wangzn1979(梦郎2001) 

谦虚点吧 :)
wangzn1979 2001-08-27
  • 打赏
  • 举报
回复
大哥,请你先搞清楚*在const前的情况和*在const后各代表的含义。
techhunter 2001-08-27
  • 打赏
  • 举报
回复
to liu_feng_fly(一只菜鸟,忽忽悠悠的就飞来了!!) 
我在vc5中使用发现p1,p2的地址不一样,且*p1='a'也可以正常运行。

一定是编译器做了手脚!!!???
LANDFISH 2001-08-27
  • 打赏
  • 举报
回复
有没有考虑过运算符优先次序的问题啊,试一下这样:(*p)='a';
哦,对了,还有,注意char * const a="abcde";这里a是一个字符串指针,而后面的赋值:
*a='k';却令a指向一个字符了,试一下*a="k"
liu_feng_fly 2001-08-27
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
char* p1="liu_feng_fly";
char* p2="liu_feng_fly";
printf("%p\n",p1);
printf("%p\n",p2);
//*p1='a'; 如果不注释掉编译通过,运行出错
return 0;
}
运行一下这个程序,你会发现p1和p2指向的地址是一样的。还有如果写*p1='a';那么编译可以通过,但是运行的时候报错,说内存为read,不能为write
给分吧,呵呵
加载更多回复(5)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧