我对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;
}
答案 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;)值。