【问题标题】:strcat causing segmentation faultstrcat 导致分段错误
【发布时间】:2011-11-23 21:24:08
【问题描述】:

这会导致分段错误:

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]," ");

str1 取自 scanf,并且少于 60 个字符。 array[i] 来自一个动态的字符串数组。

您知道导致问题的原因吗?它只发生在大量scanfs 中。

【问题讨论】:

  • array[i] 太小而无法容纳额外的数据,或者其中一个字符串不是以空值结尾的。
  • 您应该提供有关如何分配数组字符串以及如何创建 str1 的更多信息。可能是 str1 对 array[i] 来说太大了。
  • 你是如何分配array[i]的?
  • 请提供更多代码。可能您尝试向缓冲区写入的数据多于缓冲区的容量。

标签: c string segmentation-fault


【解决方案1】:

至少有两种可能:

  • 如果array[i]指向的缓冲区没有足够的空间,那么你将覆盖缓冲区的末尾,这通常会导致seg-fault。

  • 其中一个字符串未正确以 null 结尾,因此 strcat 只是开始遍历内存。

【讨论】:

  • @harp:缓冲区有多大?缓冲区中的原始字符串有多长? str1所指向的字符串有多长。
【解决方案2】:

要么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]," ");

【讨论】:

  • 可以strcat() 应用到未初始化的缓冲区吗?你不想写“你不能strcat()应用到一个未初始化的缓冲区”吗?
  • @Flow:是的,这是错字。现在修好了。谢谢。
【解决方案3】:
array[i]=malloc( str_len * sizeof(char *) );

这里的i 是什么?如果i 不在[0,str_len) 范围内,那么您正在访问您可能无权使用的内存...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2020-10-05
    • 2013-02-04
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多