2015-11-12 52 views
1

我有下面的代碼,我不知道str2str3的執行有什麼區別,它們都給出了相同的結果,哪一個更容易出錯? 編輯:當我測試str2的表示時,我發現有一次我的代碼崩潰,因爲str2是一個糟糕的指針!char []和char *之間的區別做strcpy時

/* strcpy example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str1[] = "Sample string"; 
    char str0[] = "Sample String and more"; 
    char* str2; 
    str2 = new char[40]; 
    char str3[40]; 
    strcpy (str2,str1); 
    strcpy (str3,str1); 
    strcpy (str2,str0);// crash happened here str2 is bad pointer!!! 
    printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); 
    delete str2; 
    return 0; 
} 
+0

定義「更容易出錯」。 – immibis

+0

'str2'更容易出錯(例如,在這種情況下,您忘記了刪除它),並且速度可能更慢 –

+2

請標記爲C++而不是C,str2 = new char [40];不是C – BobRun

回答

3

除了一個事實,即str2是一個指針,而str3是一個數組(和指針是一個比較棘手的使用,因爲你可能會忘記刪除等),另外還有一個問題:內存分配給str2是在免費空間上,通過operator new。這是一個緩慢的操作。相比之下,str3具有自動存儲持續時間,並且大多數情況下其內存分配在堆棧上,這要快得多。因此,在性能嚴重的代碼中,這可能會有所作爲。

+0

我明白你剛剛解釋過什麼........但我無法通過我的頭,是否一個「壞指針」是一個不允許的指針或它會給出輸出,但帶有警告?,意思是一個不好的指針與慢速指針相同,或者慢而不好,意味着技術上不同。 (我希望你理解我的意思是,一個SLOW指針仍然是合法的,被允許安全地執行輸出並且大多沒有警告和錯誤,但是一個BAD指針只是一個錯誤而且不能執行)對嗎?我的意思是這是我的一個形象。 –

+1

糟糕的指針是你最糟糕的噩夢。使用它是未定義的行爲,並且程序可能會在看起來工作正常1年後決定崩潰。 – vsoftco

+0

哦,這意味着,壞指針將執行和工作,無論適當還是古怪,但它會工作,我得到的權利?和一個SLOW指針?將在這種情況下/背景下。請原諒我愚蠢的審訊,但很長一段時間,我有一個類似的疑問在我的灰色地帶晃來晃去......我想今天我可能會結束它,因爲這個問題正確地瞄準了我幾個月來一直在掙扎的東西。 –

相關問題