2016-02-24 74 views
1
#include<string.h> 
int main() 
{ 
    char *s; 
    strcpy(s,"asdqw"); 
    strcpy(s,s+2); 
    return 0; 
} 

這個程序在linux系統下運行時沒有顯示任何錯誤,它工作正常。 但是,當在mac osx中運行時,它顯示中止陷阱:6。 這是怎麼發生的?strcpy anamoly,underfined behavior

回答

2

您必須將內存分配給s。像這樣:

char *s = malloc(100); 

否則,會導致未定義的行爲。由於行爲未定義,因此它在Linux上工作而不在OS X上工作都是合理的。

另外,正如@Florian Zwoch明智地指出的那樣,第二個strcpy()在重疊的內存區域上運行,這會重新調用未定義的行爲。這是因爲strcpy()不允許存儲區重疊。您可能想要使用memmove(s, s + 2, sizeof (s + 2));,它允許目的地和來源重疊。

+1

此外,第二個strcpy在重疊內存區域上運行。這種行爲是不確定的。 –

+0

你說@sun的答案在這裏不是問題,它仍然彈出同樣的錯誤。 –

+0

@FlorianZwoch謝謝你指出。改進的割草。 –

0

你可以在Linux上運行「Valgrind」,看看有沒有關於內存的錯誤。

Valgrind easy Tutorial這是一個簡單的教程如何使用它。

這是因爲它可能是一個內存問題。