2012-10-11 25 views
2

我想分配一個char*char*,如果我使用strcpy我得到幾個運行時間內存問題,所以我通過使用= operator簡單分配來解決它。 任何人都可以解釋在使用strcpy之前應該準備的內容以避免內存問題。我怎樣才能安全地使用strcpy

編輯:

int Function(const char* K,char* FileIN,char* FileOut,int DC) 
{ 
    char *fic_in,*n_fic,*fic_out,*fic_dec; 

    unsigned char k[17]; 

     fic_in = (char*)malloc(60*sizeof(char)); 

     strcpy((char*)k,K); 

     //strcpy(fic_in,FileIN); //I remove this one 
     fic_in=FileIN;   //and replace it by this 
     ... 
+1

http://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy –

+0

您是否預先在目標char *中預留了必要的空間?根據參考(http://www.cplusplus.com/reference/clibrary/cstring/strcpy/): 「爲避免溢出,目標指向的數組大小應足夠長以包含與源相同的C字符串(包括終止的空字符),並且不應該在內存中與源重疊。「 – dunadar

+1

由於技術上的困難,我們暫時無法閱讀您的想法。請顯示代碼。 – Rost

回答

4
const char *a = "string literal"; 
const char *b; 

a是一個指向字符串文字的指針。 b是一個指針,它並不指向任何地方(它是未初始化的)。

b = a; 

b現在指向同一個內存a點。

char c[100]; 

c現在是一個100個字符的數組。記憶的這個區域到目前爲止與其他一切完全分開。

strcpy(c, a); 

的內容c(具體而言,前15個字節)現在持有相同的值作爲存儲器指向a。所以現在有兩個區域的內存包含相同的字符串數據。

正如你所看到的,分配指針與strcpy幾乎沒有什麼共同之處。如果你想分配一個char*char*,那麼你不應該在strcpy附近的任何地方。

閱讀一本關於C++的書很重要,但strcpy的基本要求是目標指針必須指向一個內存區域,該區域有足夠的空間存放源指針指向的字符串。可能你的「運行時間記憶問題」是因爲你沒有確定,這就是爲什麼你需要閱讀一本書。

+0

謝謝你的解釋,分配指針和strcpy之間的區別對我來說很明顯,但我的問題是關於使用strcpy的問題,以及我怎樣才能使其無效:) – Oumaya

+0

@oumaya:它是無法確切地說明您所顯示的有限代碼中的問題。但最終的答案就是我所說的,你必須從*某處*獲得足夠的空間。有多種方法可以做到這一點。 –

+0

是的,我的觀點是遞歸調用它的目錄樹中的每個文件的函數爲它的子目錄,所以我認爲和你提到它是關於有一個有效的指針和足夠的內存空間:) – Oumaya

3

簡短的回答:你不應該使用strcpy所有,而是strncpy。後者的功能是而不是依賴尾隨\0,並要求您提供複製的最大長度。

此外,對於指針分配,您根本不需要strncpy。你想拷貝的內存還是乾脆重新指定指針?對於重新分配,=運營商是完全正常的。

+0

也許是一個有用的評論,但根本不是一個正確的答案。當你應該使用指針賦值而不是任何庫函數時,它沒有任何迴應。 – hvd

+0

是的,我只是想澄清這一點。 – Gnosophilon

+0

我完全+1這個,但@Gnosophilon,在簡單地分配一個char *到另一個char *時,在什麼時候strncpy *不需要*需要?=)在我的世界裏,從來沒有=) – WhozCraig

2

char*是一個指向你的字符串的字符的指針。要製作副本,您需要先爲其分配內存並運行副本。像

size_t l = strlen(src); 
char *dst = malloc(l+1); 
memmove(dst,src,l+1); 

(並做一些錯誤檢查,如果malloc成功等)。

雖然,考慮到您的問題被標記爲c++,但我建議您使用std::string班,並同時進行一些閱讀。它真的有助於理解事情的實際工作。

1

您需要確保接收緩衝區足夠大以適合源字符串,包括末尾的終止'\0'-字符。這就是它。

如果您可以將字符串表示爲僅可以複製的char *指針,那麼這很棒,但並非總是可行。