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