#include<string.h>
int main()
{
char *s;
strcpy(s,"asdqw");
strcpy(s,s+2);
return 0;
}
这个程序在linux系统中运行时没有出现任何错误,它运行正常。 但是当在mac osx中运行时,它显示中止陷阱:6 。 为什么会这样发生呢?
答案 0 :(得分:2)
您必须为s
分配内存。像这样:
char *s = malloc(100);
否则,会导致未定义的行为。由于行为是未定义的,因此它在Linux上工作而不在OS X上运行都是合理的。
另外,正如@Florian Zwoch明智地指出的那样,第二个strcpy()
在重叠的内存区域上运行,这会再次调用未定义的行为。这是因为strcpy()
不允许内存区域重叠。您可能希望使用memmove(s, s + 2, sizeof (s + 2));
,它允许目标和来源重叠。
答案 1 :(得分:0)