2011-11-23 50 views
0

這將導致分段錯誤:的strcat造成分段錯誤

char str1[60]; 
char**array; 

array=malloc(str_nos * sizeof(char *)); 
array[i]=malloc(str_len * sizeof(char *)); 

strcat(array[i],str1); 
strcat(array[i]," "); 

str1scanf採取了,它比60個字符短。 array[i]來自動態字符串數組。

你對造成這個問題的原因有什麼想法嗎?它只發生在很大數量的scanf s。

+2

「array [i]」太小而無法容納額外的數據,或者其中一個字符串是不以null結尾。 –

+2

您應該提供更多關於如何分配數組字符串以及如何創建str1的信息。這可能是str1對於array [i]來說太大了。 – Teudimundo

+0

你是如何分配'array [i]'的? – AnT

回答

3

至少有兩種可能:

  • 如果緩衝區指向array[i]未持有足夠的空間,那麼你將覆蓋緩衝區,這往往會導致賽格故障的結束。

  • 其中一個字符串不是正確的以null結尾,所以strcat只是開始遍歷內存。

+0

@harp:緩衝區有多大?緩衝區中的原始字符串有多長? 'str1'指向的字符串有多長。 –

1

要麼array[i]指向不通,或通過array[i]指向的緩衝區的長度是不夠的。

編輯:根據您發佈的代碼,array[i]指出的緩衝區最初包含未初始化的垃圾。您不能將strcat應用於包含未初始化的垃圾的目標緩衝區。

要麼使你的緩衝試圖strcat什麼它

array[i][0] = '\0'; 
strcat(array[i],str1); 
strcat(array[i]," "); 

或之前持有空字符串或者,開始strcpy,然後做strcat

strcpy(array[i],str1); 
strcat(array[i]," "); 
+0

您*可以*將'strcat()'應用於未初始化的緩衝區?你不想寫「你**不能**應用'strcat()'到未初始化的緩衝區」? – Flow

+0

@流:是的,這是錯字。現在修復。謝謝。 – AnT

0
array[i]=malloc(str_len * sizeof(char *)); 

什麼i這裏?如果i不在[0,str_len)的範圍內,那麼您正在訪問您可能沒有權限使用的內存...