使用指针执行strcat时的分段错误(核心转储)

时间:2014-06-09 10:29:46

标签: c segmentation-fault malloc coredump c-strings

我对C比较陌生。现在我知道当我们尝试使用我们无法访问的内存时会出现Segmentation fault。但我没有发现我哪里出错并想知道。任何帮助,将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str1 = "United";
char *str2 = "Front";
char *str3;

int l1,l2,l3;
l1 = strlen(str1)+1;
l2 = strlen(str2)+1;
l3 = l1 + l2; 

str3 = (char *)malloc(l3);
str3 = strcat(str1,str2);

printf("%s\n",str3);

return 0;
}

4 个答案:

答案 0 :(得分:4)

str3 = strcat(str1,str2);

str1指向一个字符串文字,你不能连接(修改)它。这会导致 undefined behaviour

strcpy(str3,str1);
strcat(str3,str2);

您必须确保为str3分配了足够的内存。

施放malloc return could be dangerous

使用main()的标准原型,例如:int main(void)int main(int argc, char*argv[])

答案 1 :(得分:3)

char *str1 = "United";
char *str2 = "Front";

会将字符串放在内存的只读部分中,并使*str1*str2成为指针,使得对此内存的任何写入操作都是非法的。

因此,您尝试将*str2指向的字符串连接到*str1,这会导致未定义的行为。

取而代之的是str3 = strcat(str1,str2);

你可以这样做

strcpy(str3,str1);
strcpy(str3+strlen(str3),str2);

相反

答案 2 :(得分:2)

下面的代码应该有效:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  char *str1 ;
  char *str2 ;
  char *str3;
  int l1,l2,l3;
  str1  = (char*)malloc(10);
  str2  = (char*)malloc(10);
  strcpy(str1,"United" );
  strcpy(str2,"Front" );

  l1 = strlen(str1)+1;
  l2 = strlen(str2)+1;

  l3 = l1 + l2; 


  str3 = (char *)malloc(l3);
  str3 = strcat(str1,str2);

  printf("%s\n",str3);

  return 0;
}

答案 3 :(得分:0)

有一个大小为(str1 + str2 + 1)的缓冲区(str3)。

使用memcpy获取所需内容。

memcpy(str3, str1, 6);
memcpy( str3 + 6, str2, 5 );

在字符串的末尾添加一个null(&#39; \ 0&#39;)值。