由于您的数组太小并且没有空终止符的空间,因此您a
在尝试复制时很可能会覆盖a
,b
因为strcpy
不知道何时停止复制。此声明将解决此特定程序的问题:
char a[4], b[4];
在一般情况下,您需要确保您的目标有足够的空间来容纳源以及空终止符。
这个例子让你更好地了解正在发生的事情,这只是为了演示目的,你应该将这样的代码用于除学习之外的任何其他事情。这对我有用ideone
,您可以查看是否存在于此处,但可能无法在其他编译器中正常工作,因为我们正在调用未定义的行为:
#include <stdio.h>
#include <string.h>
int main()
{
char a[3], b[4];
// a will have a lower address in memory than b
printf("%p %p\n", a, b);
// "abc" is a null terminated literal use a size of 4 to force a copy of null
strncpy(a,"abc",4);
// printf will not overrun buffer since we terminated it
printf("a2 = %s\n", a);
// explicitly only copy 3 bytes
strncpy(b,a,3);
// manually null terminate b
b[3] = '\0' ;
// So we can prove we are seeing b's contents
b[0] = 'z' ;
// This will overrun into b now since b[0] is no longer null
printf("a2 = %s\n", a);
printf("b = %s\n", b);
}