2011-11-23 35 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)的范围内,那么您正在访问您可能没有权限使用的内存...