返回信息流int main (){
char loc[40];
char filn[41];
char isd[1];
char hash[8];
strcpy(loc,"location");
strcpy(filn,"hahagjgjghjghj");
strcpy(isd,"1");
strcpy(hash,"hashres");
printf ("The value is: %s, %s, %s, %s\n",loc, filn, isd,hash);
}
结果为:The value is: location,,1,hashres
这是一条镜像帖。来源:北邮人论坛 / soft-design / #987同步于 2005/10/11
SoftDesign机器人发帖
挺有意义的问题,虽然很简单
sunway
2005/10/11镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
这个结果是跟编译器相关的。
gcc能得出LZ的结果,.net就能打出4个字符串。
查看了一下内存,.net在分配内存时,多分配了一些空间,所以不会出现LZ的结果,但会给出一个run-time warning
gcc下我还没用过调试功能,没有看内存。
PS: 这个结果是跟printf完全没有关系的,你可以用下面的语句
printf ("%s\n", loc);
printf ("%s\n", filn);
printf ("%s\n", isd);
printf ("%s\n", hash);
这样就打出4行,在gcc下,第2行是空行
这个问题其实自己调试一下就清楚了,
经过各路水鬼和玩家的猜测与实际分析,问题很清楚了。
1.printf并不是问题的根源,这个问题的根源是char[x]到底分配了多少空间
2.和编译器有关,不同的编译器对char[x]编译出来的代码是不一样的
Neverwinter已经分析了gcc和.net编译器下的结果,我来分析一下VC++6.0,也就是cl.exe(6.00.8168版本)编译器下的结果
我对高级语言的标准不甚明白,不知道ansi C或某个标准的C++对char[x]分配内存时做出什么样的规定,在win32平台下,这种方式下局部变量的内存空间是在栈中分配的,并且是双字对齐的,双字就是2个字,四个字节,32bit,也就是说char[1]实际在栈中分配了4个字节,cl编译器通过push ecx来分配这个空间,masm32通过add esp,-4来分配这个空间,反正都是一个结果,分配了四个字节,仅管我只需要1个字节的空间,这么做是很有必须的,为了栈的平衡,为了其他参数的双字对齐,等等,所以在VC++6.0下这个程序可以正常工作。
再说说溢出吧,strcpy是可以导致溢出,不过楼主的程序strcpy的第二个参数都没有导致溢出的可能,过短不足以覆盖到ret的返回地址,但是用str相关的API时还是要千万小心,一不小心你的程序就会背上骂名。
标准好像没有规定到这些具体实现细节
反正这个是跟编译平台相关的
【 在 flyingkisser (齐天大猫) 的大作中提到: 】
: 这个问题其实自己调试一下就清楚了,
: 经过各路水鬼和玩家的猜测与实际分析,问题很清楚了。
: 1.printf并不是问题的根源,这个问题的根源是char[x]到底分配了多少空间
: ...................