奇了怪了!

yanxiazhiqiu 2005-11-07 10:18:03
#include<stdio.h>
#include<string.h>
void main(){
char a[]="aa";
char b[2];
int c=strlen(a);
int d=strlen(b);
printf("%d%d\n",c,d);
strcpy(b,a);
int e=strlen(a);
int f=strlen(b);
printf("%d%d\n",e,f);
}
输出结果:
24
02
谁能解释一下啊?

编译器:gcc 3.4.3
...全文
232 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanxiazhiqiu 2005-11-07
  • 打赏
  • 举报
回复
sizeof(a)==3
勉励前行 2005-11-07
  • 打赏
  • 举报
回复
char a[]="aa";
sizeof(a) = 2 或是 3 ?
如果是2,那麼strcpy(b,a);會發生什麼情況?
如果是3,樓主說的情況又是如何出現的?
wuwen19 2005-11-07
  • 打赏
  • 举报
回复
感觉关键是 b 跃界了吧? char b[3]就好了。
yanxiazhiqiu 2005-11-07
  • 打赏
  • 举报
回复
b在内存中是??,为什么他的length会是随机的?
strcpy()是怎么让a由aa ????到 a ????的?
wuwen19 2005-11-07
  • 打赏
  • 举报
回复
学习。
oilking_zhh 2005-11-07
  • 打赏
  • 举报
回复
我作出来得结果是26 22,第一个的输出结果中,d是一个随机的,因为没有内容。
我是用VC6做得,期待中~~~~~~~~
flyelf 2005-11-07
  • 打赏
  • 举报
回复
这涉及到变量在内存中的分布,此处,a和b在内存的分布为
??aa ???????
__~~~
b a

第一个的输出结果中,d显然是一个随机的,可能是4,也可能是1或者是0
而第二个输出中,由于执行了strcpy,把a的第一个字符覆盖为\0了,即内存中的值成为如下:
aa a ?????
__~~~
b a
显然,b的长度成了2,而a则由于第一个字符就是字符串终结符,长度为0
Holmescn 2005-11-07
  • 打赏
  • 举报
回复
这主要是编译器的处理方法。因为a和b都是在main的函数体内,所以应该算自动变量,所以它们都是在栈上被创建,地址应该是连在一起的,我这里只有VC6,所以只说VC6的情况。因为我们用的是IA-32的CPU,所以可以同时传递32位的数据,也就是4个字节长。为了保证CPU的效率,VC6做了字节对齐。也就是所有的数据都是4字节的整数倍。当然这指的是只有大小,没有初始化的变量。比如这里的b,又因为b和a是连在一起的,而b没有结束标志\0,所以b和a就连在一起了。这里b是2,小于4,所以b是4字节,加上a的两字节,一共是6字节。如果b的维数>4了,那就给b 8个字节了。则一共是10字节。VC里的处理是把这些未初始化的字节用0xcc填充。
当然,在strcpy以后,b的空间里有了自己的结束符,所以它就是两字节了。
至于楼主说的,我就不知道了,应该也差不多吧。
Grubby_c 2005-11-07
  • 打赏
  • 举报
回复
我用VC做的也是26 22
jiangabc 2005-11-07
  • 打赏
  • 举报
回复
b在内存中是??,为什么他的length会是随机的?

用strcpy 将“长空间”(a[3])给“短空间”(b[2])时是否“覆盖”是不是和编译器有关,
在VC 6。0里上面题的运行结果2X 22
TC 2。0 里运行结果2X 22
(X 在我机子上分别是6 和 5)
yanxiazhiqiu 2005-11-07
  • 打赏
  • 举报
回复
谁能把char *strcpy(char *dest,char *sour)的内部实现机制说一下?
vikingemail 2005-11-07
  • 打赏
  • 举报
回复
a[2] == '\n'
codearts 2005-11-07
  • 打赏
  • 举报
回复
int d=strlen(b);
这里d都没有初始化,strlen要以\0来作用结束条件,得到结果是随机的


char a[]="aa";
char b[2];
strcpy(b,a);
很明显,a是a[3]这种定义,b是b[2],长度不够,都装不下呀

K 2005-11-07
  • 打赏
  • 举报
回复
char b[3];//char b[2];越界

69,371

社区成员

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

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