使用strcat的分段错误(str1,str[pos]) #包括 #包括 #包括 int main() { char*str=“abcdef”; char*str1=malloc(strlen(str)+1); strcat(str1,str[1]); printf(“字符串=%s\n”,str1); 返回(0); }

使用strcat的分段错误(str1,str[pos]) #包括 #包括 #包括 int main() { char*str=“abcdef”; char*str1=malloc(strlen(str)+1); strcat(str1,str[1]); printf(“字符串=%s\n”,str1); 返回(0); },c,C,因此,当我想将str中的一个字母连接到strct(str1,str[1])时,我得到了“分段错误”,str1是malloc(),但未初始化。这意味着内存块包含程序启动时内存中的任何随机垃圾。由于strcat附加到其目的地的末尾,因此它将搜索*str1以查找空值,然后在那里开始涂鸦 因为您没有初始化str1,所以空值可能位于ram中前面的任何位置,您可能会在一些重要的东西上涂鸦,比如堆栈 您需要将内存块memset()设置为全部null,或者至少将str[1]设置为null。函数strcat将一个

因此,当我想将str中的一个字母连接到strct(str1,str[1])时,我得到了“分段错误”,str1是malloc(),但未初始化。这意味着内存块包含程序启动时内存中的任何随机垃圾。由于
strcat
附加到其目的地的末尾,因此它将搜索
*str1
以查找空值,然后在那里开始涂鸦

因为您没有初始化str1,所以空值可能位于ram中前面的任何位置,您可能会在一些重要的东西上涂鸦,比如堆栈


您需要将内存块memset()设置为全部null,或者至少将str[1]设置为null。

函数
strcat
将一个以nul结尾的字符串追加到另一个字符串上。您已经为新字符串分配了内存,但它在nul终止之前还不是“字符串”,请使用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* str="abcdef";
    char* str1 = malloc(strlen(str)+1);

    strcat(str1,str[1]);
    printf("String = %s\n", str1);

    return(0);
}
或者

*str1 = 0;
然后,当您使用
strcat
附加原始字符串时,您将使用

str1[0] = 0;
这是必须的

strcat(str1, str[1]);

如果要将
str
的第二个字符附加到
str1
,请尝试这种方式:

strcat(str1, str);
#包括
#包括
#包括
int main()
{
char*str=“abcdef”;
char*str1=malloc(strlen(str)+1);//malloc只分配内存
strcpy(str1,str);//您需要将str复制到str1
printf(“字符串=%s\n”,str1);
字符str2[]={str[1],'\0'};
strcat(str1,str2);//strcat接受两个以null结尾的字符串作为参数
printf(“字符串=%s\n”,str1);
返回(0);
}
strcat()
取决于空终止字符。它搜索提供给它的第一个参数,该参数必须是空终止字符串,然后将第二个参数连接到它,该参数也必须是空终止字符串

当您使用
malloc()
分配内存时,产生的分配是未初始化的。因此,使用它调用
strcat()
会调用未定义的行为。一种可能的解决方案是将分配内存的第一个元素设置为空终止字符
'\0'
。您还可以使用
calloc()
将整个分配初始化为0的函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *str="abcdef";
    char *str1 = malloc(strlen(str)+1); // malloc just allocates the memory

    strcpy(str1, str); // you need to copy str to str1
    printf("String = %s\n", str1);

    char str2[] = { str[1], '\0' };

    strcat(str1, str2); // strcat takes two null terminated strings as arguments
    printf("String = %s\n", str1);

    return(0);
}
#包括
#包括
#包括
int main()
{
char*str=“abcdef”;
char*str1=malloc(strlen(str)+1);
str1[0]='\0';
strcat(str1,str);
printf(“字符串=%s\n”,str1);
返回(0);
}

您正在传递一个字符,其中需要指向字符串的指针。这通常以segfault结束。在调用
strcat
时,编译器应该给您一条错误(或至少警告)消息。如果是这样,您已经(a)忽略了编译器的诊断,并且(b)没有在问题中提到它。
char*str1=(char*)malloc(strlen(str)*sizeof(char))
?@Hearner否,
sizeof(char)
根据定义是
1
,它需要
+1
作为字符串终止符。而且,它不需要演员阵容。至少问题中的那一行是正确的。你的e也漏掉了一点。OP正在将str[1]传递给strcat,这是一个字符…我看到的第一个严重错误是这个。为什么还要费心去寻找“strcat(str1)”…?这是一个严重的错误,就在那里,所以我真的不理解对这个问题的反对意见:(@MartinJames I没有DV,但最初评论说将
str[1]
设为null是错误的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* str = "abcdef";
    char* str1 = malloc(strlen(str) + 1);

    str1[0] = '\0';

    strcat(str1, str);
    printf("String = %s\n", str1);

    return(0);
}