strcpy anamoly,underfined behavior

时间:2016-02-24 08:11:11

标签: macos strcpy

#include<string.h>
int main()
{
     char *s;
     strcpy(s,"asdqw");
     strcpy(s,s+2);
     return 0;
}

这个程序在linux系统中运行时没有出现任何错误,它运行正常。 但是当在mac osx中运行时,它显示中止陷阱:6 。 为什么会这样发生呢?

2 个答案:

答案 0 :(得分:2)

您必须为s分配内存。像这样:

char *s = malloc(100);

否则,会导致未定义的行为。由于行为是未定义的,因此它在Linux上工作而不在OS X上运行都是合理的。

另外,正如@Florian Zwoch明智地指出的那样,第二个strcpy()在重叠的内存区域上运行,这会再次调用未定义的行为。这是因为strcpy()不允许内存区域重叠。您可能希望使用memmove(s, s + 2, sizeof (s + 2));,它允许目标和来源重叠。

答案 1 :(得分:0)

您可以在Linux上运行“Valgrind”,看看是否有关于内存的错误。

Valgrind easy Tutorial这是一个如何使用它的简单教程。

这是因为它可能是一个记忆问题。