用strcpy命令,源字符串的值怎么发生变化了呀?
#include <stdio.h>
#include <string.h>
void main()
{
char source[]= "We change lives ";
char target[]= "Test ";
strcpy(target,source);
printf( "%s ",source);
}
[解决办法]
因为target只占用5个字节空间,而source占用16字节大小,source和target在栈中是相邻的
strcpy内部实现相当与
while(*target++=*source++);
所以调用strcpy后会覆盖target部分内容
[解决办法]
可能你用的编译器没有避免这样错误的功能,我刚才在devc++和vsC++上面试了一下你的代码,是没有问题的。
[解决办法]
在栈上,target的尾接到source的头部,target又装不下source,所以越界覆盖了source的头部.
[解决办法]
可能你用的编译器没有避免这样错误的功能,我刚才在devc++和vsC++上面试了一下你的代码,是没有问题的。
================
运行没错,不意味代码没问题.编译器不能避免这种越界覆盖的.
[解决办法]
vs2005的调试版可以报告target的越界写.赞一下.
[解决办法]
哈哈哈,楼主,那种代码很危险,很恐怖的,不要那样子写
我没有测过,不过,如果微软也有人这么干,我就高兴了
[解决办法]
target 和source所占有的字节不相同,小的把大的给覆盖了,所以越界覆盖了source的头部
[解决办法]
。。。
在我的vs2005上,代是行不起的。
target明越界了。
不是能看到source并有被覆。
[解决办法]
覆盖了
[解决办法]
上面解释很清楚拉...
[解决办法]
解和有是不一致的。
[解决办法]
gfxiang(afu)
source和target在栈中是相邻的
-----------------------------------------------------
真的相邻吗? 我看了一下栈中的情况,target的地址比source的地址高,他们不相邻,中间还隔了几个00 byte.(具体是几个不太确定,随target的初始值的变化而变化)
谁帮忙解释一下?
[解决办法]
不好。
一般好像初始化的候是相的
但也不一定全是。
比如在我的VS2005下就不是相的。
[解决办法]
我在linux gcc下,
分配的空间也不相邻,按说应该相邻的呀.
好象是一次是按16个字节为一个单位进行分配的.不明白,请高手解释一下.
[解决办法]
那就是考对齐原则吧。
[解决办法]
建议用strncpy
[解决办法]
linux下gcc测试
source和target在栈中是相邻的。
#include <stdio.h>
#include <string.h>
void main()
{
char source[]= "We change lives ";
char target[]= "Test ";
strcpy(target,source);
printf( "%s\n ",source);
printf( "%s\n ",target); //增加一条输出语句
}
输出为:
We change lives
We change lives
why?
[解决办法]
cxvxv
[解决办法]
不要使用 strcpy (太危险了) ,建议使用strncpy
我在vc6下测试,二者不是完全相邻的,中间有三个字节的空。
target地址较低(小),source的地址较高(大)
行1 运行strcpy之前的内存分配( '\n '用@代替, 三个字节的空隙用#代替),
行2 如 gfxiang(afu) 所说的strcpy的实现方式,运行strcpy之后的内存分配
target source
| |
行1 :Test@###We change lives@
行2 :We change lives@e lives@
所以打印source时(见行2),打印的是 e lives (遇到换行符结束打印)
[解决办法]
呵呵,似乎是越界
[解决办法]
不相邻的情况那是编译器考虑4字节边界对齐
[解决办法]
to gfxiang(afu)
char类型也需要考虑对齐吗?
[解决办法]
嗯,char型也需要。
[解决办法]
strcpy_s也比较保险,会检测数组越界