c++ 为什么没有报错?

char*a[3]={{"hahahaha"},{"hehehehe"},{"xixixixi"}};char*hash[3];hash[*a[0]]="aaaaa";h... char *a[3]={{"hahahaha"},{"hehehehe"},{"xixixixi"}};
char *hash[3];
hash[*a[0]]="aaaaa";
hash[*a[1]]="bbbbb";
hash[*a[2]]="ccccc";
printf("%s===>%s\n",a[0],hash[*a[0]]);
printf("%s===>%s\n",a[1],hash[*a[1]]);
printf("%s===>%s\n",a[2],hash[*a[2]]);
展开
 我来答
欢乐多Ek
2013-07-31 · TA获得超过478个赞
知道小有建树答主
回答量:477
采纳率:0%
帮助的人:418万
展开全部

两个编译器给你试了试,自己看吧。

第一个是cl 10.0 微软的编译器,vs2010带的。

编译正常,运行正常。

 

 

另一个是g++ 4.6

编译出错,应该是无法这样初始化字符串数组,把括号去掉再编译。

编译正常,运行不正常,应该是数组超范围了。

鬼扯石室2007
2013-08-01 · TA获得超过218个赞
知道答主
回答量:68
采纳率:100%
帮助的人:60.5万
展开全部
楼主您好!
我来帮你分析一下,(验证图请参看其他楼层的贴图)
1)a[3]是一个元素为char *的数组,这叫指针数组
通过 char *a[3]={{"hahahaha"},{"hehehehe"},{"xixixixi"}};
使a[3]中三个数组元素分别保存的是
hahahaha
hehehehe
xixixixi
三个字符串的首地址

2)char * hash[3]也是一个含有三个char *指针元素的指针数组
但是,在进行以下操作时
hash[*a[0]]="aaaaa";
hash[*a[1]]="bbbbb";
hash[*a[2]]="ccccc";
*a[0]实际上是对字符串hahahaha的首地址进行'*'运算
其结果为首字符h
即 *a[0] == 'h'
同理 *a[1] == 'h'
*a[2] == 'c'
又h、c的ASCII码分别为:104、99
因此,实际上数组hash赋值应该是
hash[104]="aaaaa";
hash[104]="bbbbb";
hash[99]="ccccc";

3)编译器允许其编译通过
但是在g++编译后运行时,hash数组越界访问,造成段错误,程序终止
在vc编译后运行时,虽然没有发生段错误,但是由结果
hahahaha===>bbbbb
hehehehe===>bbbbb
可以印证
hash[*a[0]]
hash[*a[1]]
确实是指向的同一个内存地址
希望能解答您的问题。
祝您愉快。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jsnjzhaoxy
2013-07-31 · TA获得超过1322个赞
知道小有建树答主
回答量:611
采纳率:0%
帮助的人:174万
展开全部

应该报错了

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gm7996
2013-07-31 · TA获得超过1199个赞
知道小有建树答主
回答量:645
采纳率:100%
帮助的人:548万
展开全部
语法没有错 编译不会报错

运行时 hash[*a[0]]="aaaaa"; 此处报错

没有初始化就赋值 没有空间
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式