2014-11-22 65 views
1

首先,我寫了一個簡單的程序。strncat上的分割錯誤()

1 #include <string.h> 
    2 #include <stdio.h> 
    3 #include <stdlib.h> 
    4 
    5 int main() 
    6 { 
    7  char *buf = (char*)malloc(sizeof(char)*2000); 
    8  char tmp[256]; 
    9  strcpy (tmp, "test"); 
10  printf ("tmp: %s\n", tmp); 
11  strncat (buf, tmp, strlen(tmp)); 
12  printf ("buf: %s\n", buf); 
13 } 

預期的結果是:

tmp: test 
buf: test 

但之後我在大項目相結合的代碼。 (使用大量堆段)

153  char *inbuf = (char*)malloc(sizeof(char)*2000); 
154  char *outbuf = (char*)malloc(sizeof(char)*2000); 
155  char *oldinbuf = (char*)malloc(sizeof(char)*2000); 
156  char *errbuf = (char*)malloc(sizeof(char)*2000); 
157  memset (inbuf, '\0', strlen(inbuf)); 
158  memset (oldinbuf, '\0', strlen(oldinbuf)); 
159  memset (errbuf, '\0', strlen(oldinbuf)); 

然後在行:11,我得到錯誤信息Segmentation fault (core dumped)

是否有任何可能性,strncat導致段故障?

+0

因爲我需要連接在'buf'和'tmp'新的內容舊的內容,和我查了老inbuf內容謹慎(在malloc大小內)。 – 2014-11-22 10:25:55

+0

在'strncat()'之前我們沒有看到'buf'被任何值初始化,這就是爲什麼你會看到這個問題。如果buf在'strncat'之前有一些值,那麼這將工作正常。因此,如果是這種情況,你可以使用'strncpy()' – Gopi 2014-11-22 10:31:04

+0

而不是'malloc + memset',你可以使用'calloc' [這可能會更快](http://stackoverflow.com/questions/2688466/why- mallocmemset-是-慢於釋放calloc /)。你在第157-159行的memset設置[錯誤的字節數](http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an-array) 。此外[請參閱此處](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)malloc的現代用法。 – 2014-11-22 10:33:25

回答

6

這條線是未定義行爲

strncat (buf, tmp, strlen(tmp)); 

因爲buf來自malloc初始化。另一方面,strncat期望buf包含以空字符結尾的C字符串。

您可以通過將buf的首字符設置爲'\0'來解決此問題。

1

如果您打算使用strcatsttrncat那麼buf應具有有效的字符串。所以寫

char *buf = (char*)malloc(sizeof(char)*2000); 
buf[0] = '\0'; 

此外,如果你使用strncat那麼你總是要追加自己終止零的複製將是安全的。例如

size_t n = strlen(tmp); 
strncat (buf, tmp, n + 1); 
buf[n] = '\0'; 

儘管在這種特殊情況下,你可以使用簡單的strcat代替strncat