list->history=(char*)malloc(sizeof(char));
strcpy(list->history,pch2);
當我使用上面的代碼時,我無法打開多個文件。它給了我這個錯誤:Aborted(核心轉儲)
* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)
我怎樣才能打開多個文件?
list->history=(char*)malloc(sizeof(char));
strcpy(list->history,pch2);
當我使用上面的代碼時,我無法打開多個文件。它給了我這個錯誤:Aborted(核心轉儲)
* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)
我怎樣才能打開多個文件?
由於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
,strncat
和snprintf
是非常不一致的關於長度參數的含義以及是否和如何添加空終止符)。
...並且缺少空字符(有時) –
memcpy(list-> history,pch2,N)將會執行此操作 – cfz42
@clement_frndz:'memcpy'不起作用,因爲它不會掃描源終止符,並在源字符串短於'N'時導致UB。 –
您的malloc()
有問題,它沒有爲指針分配足夠的內存以用作strpy()
中的目標字符串。
我的建議:擺脫malloc()
和strcpy()
/strncpy()
,使用strdup()
。更好。
簡單,使用
list->history = strdup(pch2);
見here,爲什麼不使用strncpy()
。
C:中沒有'strdup' :-( –
@KerrekSB同意,但不是POSIX,一般接受嗎? –
我解決了這個問題,這裏的改進代碼:
a=strlen(pch2);
list->history=(char*)malloc(a*sizeof(char) + 1);
strcpy(list->history, pch2);
沒有。終止\ 0沒有空間。你需要malloc(a * sizeof( char)+ 1)。strlen(「abc」)= 3,但是str [3] ='\ 0'這會產生4個字符。 – cfz42
沒有足夠的信息。但是你的malloc不正確。你只允許表演一個字節 – mjs