2015-05-22 199 views
-2
list->history=(char*)malloc(sizeof(char)); 
strcpy(list->history,pch2); 

當我使用上面的代碼時,我無法打開多個文件。它給了我這個錯誤:Aborted(核心轉儲)

* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)

我怎樣才能打開多個文件?

+3

沒有足夠的信息。但是你的malloc不正確。你只允許表演一個字節 – mjs

回答

3

由於sizeof(char)爲1,因此您正在分配1個字節,因此strcpy將具有未定義的行爲,除非源字符串爲空。

請勿使用strcpy;使用strncpy替代,同時也要注意你的分配大小和空終止的:

size_t N = 1; // or anything you deem suitable 

list->history = malloc(N); 
strncpy(list->history, pch2, N - 1); // safe 
list->history[N - 1] = '\0'; 

(實際上,情況有點糟糕,因爲無論strcpy也不strncpy是絕對有好處的功能就其本身而言,strcpy ISN」 t安全,因爲你不能控制輸出緩衝區大小,並且strncpy效率低,因爲它寫入的字符數多於可能需要的值;既不返回指向最後複製字符的指針,而且集合strncpy,strncatsnprintf是非常不一致的關於長度參數的含義以及是否和如何添加空終止符)。

+1

...並且缺少空字符(有時) –

+0

memcpy(list-> history,pch2,N)將會執行此操作 – cfz42

+0

@clement_frndz:'memcpy'不起作用,因爲它不會掃描源終止符,並在源字符串短於'N'時導致UB。 –

1

您的malloc()有問題,它沒有爲指針分配足夠的內存以用作strpy()中的目標字符串。

我的建議:擺脫malloc()strcpy()/strncpy(),使用strdup()。更好。

簡單,使用

list->history = strdup(pch2); 

here,爲什麼不使用strncpy()

+0

C:中沒有'strdup' :-( –

+0

@KerrekSB同意,但不是POSIX,一般接受嗎? –

-2

我解決了這個問題,這裏的改進代碼:

a=strlen(pch2); 

list->history=(char*)malloc(a*sizeof(char) + 1); 

strcpy(list->history, pch2); 
+3

沒有。終止\ 0沒有空間。你需要malloc(a * sizeof( char)+ 1)。strlen(「abc」)= 3,但是str [3] ='\ 0'這會產生4個字符。 – cfz42