gpt4 book ai didi

c - 在 malloc 之后直接为 char 指针赋值会导致段错误

转载 作者:行者123 更新时间:2023-11-30 20:02:48 24 4
gpt4 key购买 nike

我正在尝试对 char 数组执行简单的字符串操作 (strcat)。我尝试了两种方法。

在第一种情况下,我将内存分配给 char*,然后通过 scanf() 分配该值。这种方法效果很好。

void fun1(char** s1) {
char temp[15] = "&Superman";
printf("inside fun1 %s %s\n",(*s1),temp);
strcat((*s1),temp);
}

int main()
{
char *str;
str = malloc(sizeof(char)*15);
scanf("%s",str);
fun1(&str);
printf("1st string %s\n",str);

return 0;
}

本例中的 O/p 符合预期

Batman
inside fun1 Batman &Superman
1st string Batman&Superman

在第二种方法中,我直接在 main() 中为 str 赋值,而不使用 scanf()。

void fun1(char** s1) {
char temp[15] = "&Superman";
printf("inside fun1 %s %s\n",(*s1),temp);
strcat((*s1),temp);
}

int main()
{
char *str;
str = malloc(sizeof(char)*15);
str = "Batman";
fun1(&str);
printf("1st string %s\n",str);

return 0;
}

在这种情况下,当 strcat 被执行时,我在 fun1() 内遇到段错误。

inside fun1 Batman &Superman
Segmentation fault (core dumped)

GDB o/p 来自 OnlineGDB

(gdb) r                                                                           
Starting program: /home/a.out
inside fun1 Batman &Superman

Program received signal SIGSEGV, Segmentation fault.
__strcat_sse2_unaligned ()
at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:666
666 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or direc
tory.
(gdb) bt
#0 __strcat_sse2_unaligned ()
at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:666
#1 0x00000000004006a3 in fun1 (s1=0x7fffffffebd8) at main.c:9
#2 0x00000000004006e4 in main () at main.c:17
(gdb)

我很困惑,因为字符串“Batman”能够在 fun1() 中打印,但它的 strcat 失败,尽管我对这两种情况做了同样的事情。

预先感谢您的帮助。

最佳答案

当你这样做时

str = "Batman";`

str 不再指向 malloc 的内存。它指向字符串“batman”。因此不允许您连接其他字符串。

查看此内容的一种方法是添加一些简单的打印 - 尝试:

char *str;
str = malloc(sizeof(char)*15);
printf("%p\n", (void*)str);
str = "Batman"; // str now points to a different location
printf("%p\n", (void*)str);

使用strcpy代替:

str = malloc(sizeof(char)*15);
strcpy(str, "Batman");

注意:您为“Batman”和“&Superman”的串联分配的内存太少。第一个是 6 个字符,第二个是 9 个字符,因此您需要 6+9+1 = 16 个字符。最后一个+1用于保存字符串终止符,即\0。因此除了使用strcpy之外,还需要分配16个字符。

顺便说一句:

  • 您不需要将 str 的地址传递给函数,因为该函数从不执行任何赋值,例如 *s1 = ... Something...只需传递str

  • sizeof(char) 始终为 1,因此您无需编写它。

关于c - 在 malloc 之后直接为 char 指针赋值会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59926480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com