c语言程序中,定义几个字符数组,在内存中是怎么存储的?

chartest[30]="SWORD";charlist[60]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";chardata[20]="ABCDE";s... char test[30] = "SWORD";
char list[60] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char data[20] = "ABCDE";

strcat(test,list);

printf("%s\n",test);
printf("%s\n",list);
printf("%s\n",data);
为什么最后的输出是Z,刚好是test数组之外的一个字符?
展开
 我来答
驭风者杨
2012-04-07 · 超过18用户采纳过TA的回答
知道答主
回答量:124
采纳率:0%
帮助的人:51.3万
展开全部

strcat(test,list);是把list连接到test之后,test就变成了之前的test+list。最后输出是正常的。如下图

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
adoqq_bd
2012-04-07 · TA获得超过7049个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1504万
展开全部
你的test数组太小了,strcat后越界了,最后结果不定
strcat(test,list)要求test至少要有5+26+1才能正常容纳合并后的字串
下面这样就没问题了:
char test[100] = "SWORD";
char list[60] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char data[20] = "ABCDE";

strcat(test,list);

printf("%s\n",test);
printf("%s\n",list);
printf("%s\n",data);
追问
我知道是越界了,但是为什么会影响到data[]数组的呢?这几个数组在内存中是怎么存储的呢?
追答
平台相关, 这三个数组的内存分配次序不定,并且位置间隔也不定,你的情况是test data list这样的次序分配的内存,然后strcat以后test溢出到了data的空间,并且Z字符处在了data的起始地址,我这样实验了一下(win7x86 c++express9.0),也出现了你说的情况:

#include
#include
int main()
{
char test[3] = "AA";
char list[6] = "BBBBB";
char data[4] = "CCC";

printf("%p %s\n",test,test);
printf("%p %s\n",list,list);
printf("%p %s\n",data,data);
printf("\n");
strcat(test,list);

printf("%p %s\n",test,test);
printf("%p %s\n",list,list);
printf("%p %s\n",data,data);
}

release模式运行结果:

0021F95C AA
0021F964 BBBBB
0021F960 CCC

0021F95C AABBBBB
0021F964 BBBBB
0021F960 BBB
请按任意键继续. . .

所以越界后的状况是说不清的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wu3325120
2012-04-07
知道答主
回答量:39
采纳率:0%
帮助的人:18.1万
展开全部
strcat(test,list);
意为:把list接在test后面;所以最后输出Z,另外%S遇到'\0'结束输入或输出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式