我分別在xp的環境和linux環境下編譯執行c**,我發現乙個不解的現象:
現象描述:
兩個字串 char* from, char* to;要把from的內容複製給to。
我在xp下,用strcpy(to, from)出現memory問題,於是換成
to = strdup(from),就執行正常。
而在linux下,用to = strdup(from)出現memory問題(報錯資訊:* glibc detected *** free(): invalid next size (fast): 0x09a8d868 ***),於是換成strcpy(to, from),就執行正常。
請大家指教:
1,如何解釋我遇到的這種現象;
2,strdup與strcpy具體的區別,以及在不同作業系統下的使用。
謝謝!strdup
原型:extern
char
*strdup(
char
*s);
用法:#include
<
string
.h>
功能:複製字串s
說明:返回指向被複製的字串的指標,所需空間由malloc()分配且可以由free()釋放。
舉例://
strdup.c
#include
<
syslib.h
>
#include
<
string
.h>
main()
strcpy
原型:extern
char
*strcpy(
char
*dest,
char
*src);
用法:#include
<
string
.h>
功能:把src所指由null結束的字串複製到dest所指的陣列中。
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。
返回指向dest的指標。
舉例://
strcpy.c
#include
<
syslib.h
>
#include
<
string
.h>
main()
從手冊裡copy的!~函式名: strdup
功 能: 將串拷貝到新建的位置處
用 法: char *strdup(char *str);
程式例:
c/c++ code
#include<
stdio.h
>
#include
<
string
.h>
#include
<
alloc.h
>
intmain(
void
)
函式名: strcpy
功 能: 串拷貝
用 法: char *strcpy(char *str1, char *str2);
程式例:
c/c++ code
#include<
stdio.h
>
#include
<
string
.h>
intmain(
void
)
strdup不是標準的c函式,所以linux會報錯!~strcpy是標準的c函式,在windows裡報錯是因為指標沒申請空間吧!~
可以先strlen判斷from的大小,之後為to申請空間,之後再strcpy就不會報錯了!~
strdup可以直接把要複製的內容複製給沒有初始化的指標,因為它會自動分配空間給目的指標strcpy的目的指標一定是已經分配記憶體的指標
請問:用to = strdup(from)後,應該必須用free(to)吧,謝謝
linux下的c是ansi c,strdup不是標準庫函式
strdup用完要free否則 記憶體洩露strcpy拷貝到你分配的記憶體
strdup 內部在堆上建立了乙個備份,所以即使沒看到malloc也應該在使用完畢後得自己手動釋放(free);strcpy 使用的時候,必須已經擁有了足夠的空間才行。
strdup與strcpy具體的區別
根據 strdup 的用法,寫了下面的程式 執行結果如下 首先對於 strdup 函式來說 include include 因為要用 free 函式 extern char strdup char src 函式返回乙個指標,該指標會指向 複製字串分配的空間 複製字串 src 如果分配空間失敗,則返回...
關於strcpy以及strdup的區別
strdup與strcpy具體的區別 引 我分別在xp的環境和linux環境下編譯執行c 我發現乙個不解的現象 現象描述 兩個字串 char from,char to 要把from的內容複製給to。我在xp下,用strcpy to,from 出現memory問題,於是換成 to strdup fro...
strcpy和strdup比較和詳解
extern char strdup char s 標頭檔案 string.h 功能 將串拷貝到新建的位置處 說 明 strdup不是標準的c函式。strdup 在內部呼叫了malloc 為變數分配記憶體,不需要使用返回的字串時,需要用free 釋放相應的記憶體空間,否則會造成記憶體洩漏。返回值 返...