#include<string.h>
int main()
{
char *s;
strcpy(s,"asdqw");
strcpy(s,s+2);
return 0;
}
這個程序在linux系統下運行時沒有顯示任何錯誤,它工作正常。 但是,當在mac osx中運行時,它顯示中止陷阱:6。 這是怎麼發生的?strcpy anamoly,underfined behavior
#include<string.h>
int main()
{
char *s;
strcpy(s,"asdqw");
strcpy(s,s+2);
return 0;
}
這個程序在linux系統下運行時沒有顯示任何錯誤,它工作正常。 但是,當在mac osx中運行時,它顯示中止陷阱:6。 這是怎麼發生的?strcpy anamoly,underfined behavior
您必須將內存分配給s
。像這樣:
char *s = malloc(100);
否則,會導致未定義的行爲。由於行爲未定義,因此它在Linux上工作而不在OS X上工作都是合理的。
另外,正如@Florian Zwoch明智地指出的那樣,第二個strcpy()
在重疊的內存區域上運行,這會重新調用未定義的行爲。這是因爲strcpy()
不允許存儲區重疊。您可能想要使用memmove(s, s + 2, sizeof (s + 2));
,它允許目的地和來源重疊。
此外,第二個strcpy在重疊內存區域上運行。這種行爲是不確定的。 –
你說@sun的答案在這裏不是問題,它仍然彈出同樣的錯誤。 –
@FlorianZwoch謝謝你指出。改進的割草。 –