#include <stdio.h>
#include <string.h>
int main() {
char buf[32];
int i;
printf("before strcpy_s. buf: ");
for (i=0; i < sizeof(buf); i++) {
buf[i] = '#';
printf("%c", buf[i]);
}
printf("\n");
strcpy_s(buf, sizeof(buf), "hi");
printf("after strcpy_s. buf: ");
for (i=0; i < sizeof(buf); i++) {
printf("%c", buf[i]);
}
printf("\n");
return 0;
}
编译成Debug版(更明确点,是说C/C++Code生成的选项里,VC运行库 选择 Debug版, 至于DLL版或者静态都无所谓)
我使用Visual Studio 2010 Express的。
结果:
before strcpy_s. buf: ################################
after strcpy_s. buf: hi******************************
星号是表示一些不可见的字符的,例如\0,
和想象的不一样吧!
而Relase版的结果是
before strcpy_s. buf: ################################
after strcpy_s. buf: hi*#############################
这就对了,不该碰得不要碰。
那这个Debug版的strcpy_s岂不是坑人?因为有的人buf准备的太小,例如4,那糟了,无关的后续内存会被破坏的一塌糊涂。堆栈都无法显示。