使用指针执行strcat时出现分段错误(堆芯转储)

使用指针执行strcat时出现分段错误(堆芯转储),c,segmentation-fault,malloc,coredump,c-strings,C,Segmentation Fault,Malloc,Coredump,C Strings,我对C语言比较陌生。现在我知道,当我们试图使用我们无法访问的内存时,会出现分段错误。但我没能找出哪里出了问题,我想知道。任何帮助都将不胜感激 #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)

我对C语言比较陌生。现在我知道,当我们试图使用我们无法访问的内存时,会出现分段错误。但我没能找出哪里出了问题,我想知道。任何帮助都将不胜感激

#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;
}
#包括
#包括
#包括
int main()
{
char*str1=“联合”;
char*str2=“前面”;
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);
返回0;
}
str1
指向一个字符串文本,您不能连接(修改)它。这导致了

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

以及

铸造

main()
使用标准原型,例如:
intmain(void)
intmain(intargc,char*argv[])

str1
指向一个字符串文本,您不能连接(修改)它。这导致了

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

以及

铸造

main()
使用标准原型,例如:
intmain(void)
intmain(intargc,char*argv[])

将字符串放在内存的只读部分,并使
*str1
*str2
成为指向该部分的指针,从而使此内存上的任何写入操作都是非法的

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

相反,
str3=strcat(str1,str2)

你可以这样做

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

将字符串放在内存的只读部分,并使
*str1
*str2
成为指向该部分的指针,从而使此内存上的任何写入操作都是非法的

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

相反,
str3=strcat(str1,str2)

你可以这样做

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

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

使用memcpy获取所需的内容

memcpy(str3, str1, 6);
memcpy( str3 + 6, str2, 5 );
在字符串末尾添加空('\0')值

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

使用memcpy获取所需的内容

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

在字符串末尾添加空('\0')值

下面的代码应该可以工作:

#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;
}
#包括
#包括
#包括
int main()
{
char*str1;
char*str2;
char*str3;
int l1、l2、l3;
str1=(char*)malloc(10);
str2=(char*)malloc(10);
strcpy(str1,“联合”);
strcpy(str2,“前”);
l1=strlen(str1)+1;
l2=strlen(str2)+1;
l3=l1+l2;
str3=(char*)malloc(l3);
str3=strcat(str1,str2);
printf(“%s\n”,str3);
返回0;
}

下面的代码应该有效:

#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;
}
#包括
#包括
#包括
int main()
{
char*str1;
char*str2;
char*str3;
int l1、l2、l3;
str1=(char*)malloc(10);
str2=(char*)malloc(10);
strcpy(str1,“联合”);
strcpy(str2,“前”);
l1=strlen(str1)+1;
l2=strlen(str2)+1;
l3=l1+l2;
str3=(char*)malloc(l3);
str3=strcat(str1,str2);
printf(“%s\n”,str3);
返回0;
}

谢谢您,注意要点!然而,
strcpy(str3,str1)
strcpy(str3,str2)
将输出作为前端,如何使用指针连接(输出:UnitedFront)?第二个应该是
strcat
,而不是
strcpy
,以便连接them@Doraj谢谢通常的复制粘贴错误:)是的,我太清楚了:)谢谢你们,注意点!然而,
strcpy(str3,str1)
strcpy(str3,str2)
将输出作为前端,如何使用指针连接(输出:UnitedFront)?第二个应该是
strcat
,而不是
strcpy
,以便连接them@Doraj谢谢通常的复制粘贴错误:)是的,我很清楚:)+1。严格来说,字符串文本不需要存储在只读内存中。C标准说修改它是UB。没有MMU的系统很乐意允许它。在预标准C:)@BlueMoon中修改它是可以的(有效的)。谢谢你的澄清,我已经给了你+1:)。+1。严格来说,字符串文本不需要存储在只读内存中。C标准说修改它是UB。没有MMU的系统很乐意允许它。在预标准C:)@BlueMoon中修改它是可以的(有效的)。谢谢你的澄清,我已经给了你+1:)。是的!谢谢你:是的!谢谢:D