gpt4 book ai didi

c - 尝试取消引用动态分配的指针时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:19 25 4
gpt4 key购买 nike

我有一个动态分配的 char 数组,我想将两个字符串组合到其中,所以我尝试了以下操作:

char *strcpy2 (char *str1, char *str2)
{
int total = strlen (str1) + strlen (str2) + 1;
char *nstr = malloc (sizeof (char) * total);
while (*str1 != '\0') *nstr++ = *str1++;
while (*str2 != '\0') *nstr++ = *str2++;
*nstr = '\0';
printf ("size: %d\n", strlen (nstr));
return &(nstr[0]);
}

int main (void)
{
char *concat = strcpy2 ("Hello, ", "World.");
puts (concat);
free (concat);
return 0;
}

当我运行它时,它打印出 nstr 的大小为 0,然后是 Segmentation fault (core dumped)

但是当我这样做的时候:

char *strcpy2 (char *str1, char *str2)
{
int total = strlen (str1) + strlen (str2) + 1;
char *nstr = malloc (sizeof (char) * total);
char *p = nstr;
while (*str1 != '\0') *p++ = *str1++;
while (*str2 != '\0') *p++ = *str2++;
*p = 0;
printf ("size: %d\n", strlen (nstr));
return nstr;
}

它工作正常并打印了正确长度的 nstr。我很困惑,是什么导致了崩溃?

最佳答案

您需要返回 nstr 最初由 malloc() 返回的值。

您的第一个代码块递增 nstr 直到它指向已分配内存的末尾。然后代码尝试使用并释放该地址,该地址不属于您的程序。

您需要保存字符串的起始地址,以便返回它。

关于c - 尝试取消引用动态分配的指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33639155/

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