2011-07-04 147 views
4
#include<string.h> 
#include<stdio.h> 

int main() 
{   
    char *p;   
    strcpy(p,"hello world"); 
} 

那麼,它顯示undefined behaviour還是它指向hello世界?我見過很多使用這種類型的sytax的程序員。我知道它比一個你不知道字符串大小的數組更好。但是,在編程中使用它會很好嗎?任何人都可以解釋它?字符串和指針

+0

當我嘗試運行此操作時,出現段錯誤。它在運行時編譯並失敗。這我希望從一個未初始化的指針。 – ncmathsadist

回答

4

這是未定義的行爲,因爲p未初始化。我不認爲你實際上看到很多人這麼做...

strcopy需要足夠長度的緩衝區以將第二個參數的內容複製到。你的例子是故意設計的,但在實際代碼中,你需要知道source_string的大小才能分配緩衝區。

+0

動態分配如何工作? – cody

+0

嘿你知道如何給一個數組動態內存分配? – cody

+0

好的,如果需要,你可以動態分配緩衝區,但是這不會改變響應。你可以很好地在棧上分配一個'char [12]'來保存字符串''hello world'''。 –

0

p未初始化並將任何內容複製到它將產生Segmentation Fault和不可預知的結果,因爲p指向的內存中的位置未由代碼指定。

在將字符串複製到p之前,必須指定p指向的內存。

你應該使用char [Buffersize];
例如char [12];

+1

或'char [12]'=) –

2

你沒有初始化p,這樣的行爲是明確的定義。如果將p初始化爲指向一個有足夠空間容納字符串的區域,或者將p指定爲(不是strcpy()"hello world"p(因此將其指向存儲文字字符串的初始化程序存儲器中的區域),或者使用strdup()它會起作用,而不是strcpy()

+0

感謝你的geeko向我介紹了新的strdup函數。 – cody

1

我見過很多使用這種語法的程序員 。

我對此表示懷疑。也許有一些這樣的語法,但不包含這些語義,即不是沒有'p'指向足夠容納字符串的內存區域,包括其尾部的空字節。

1

您發佈的代碼是完全錯誤的,可能會導致程序崩潰,而且很難想象您會經常看到類似的代碼。

您更可能看到類似以下的代碼。

int main() 
{ 
    char *p = (char*)malloc(20); 
    strcpy(p, "hello world"); 
    free(p); 
} 
+0

是你的權利喬納森 – cody

1

您不必分配和複製來獲取字符串。你可以讓編譯器爲你做所有的工作:

char p[] = "Hello world!"; 

它甚至會計算出適當的數組大小!