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]]); 展开
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]]); 展开
4个回答
展开全部
楼主您好!
我来帮你分析一下,(验证图请参看其他楼层的贴图)
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]]
确实是指向的同一个内存地址
希望能解答您的问题。
祝您愉快。
我来帮你分析一下,(验证图请参看其他楼层的贴图)
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]]
确实是指向的同一个内存地址
希望能解答您的问题。
祝您愉快。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
语法没有错 编译不会报错
运行时 hash[*a[0]]="aaaaa"; 此处报错
没有初始化就赋值 没有空间
运行时 hash[*a[0]]="aaaaa"; 此处报错
没有初始化就赋值 没有空间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询