gpt4 book ai didi

c - 试图将 2 个字符串组合成一个新的函数

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

代码好吗?当我在函数中使用 puts(nstr) 时,我确实得到了正确的结果,但是当我在 main 上时,我得到的只是“riends”输出。如果有帮助,请使用 Microsoft Visual C++ Express。

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

char* strcpy2 (char* str1, char* str2)
{
char nstr[20];
int i,j;
for (i = 0; str1[i] != '\0'; i++)
{
nstr[i] = str1[i];
}
for (j = i, i = 0; str2[i]!='\0'; i++, j++)
{
nstr[j] = str2[i];
}
nstr[j] = '\0';
return nstr;
}

void main()
{
char str1[10] = "Hello";
char str2[10] = ",friends";
puts(strcpy2(str1, str2));
}

最佳答案

总结

欢迎来到 SO。主要问题是您返回的变量地址在您尝试使用时已超出范围。

详情

调用函数时,局部变量被压入堆栈(不是数据结构!)。在这里,您的本地 nstr 数组变量被压入,据说是在函数范围内定义的。

然而,当函数返回时,局部变量连同它们所在的堆栈一起被销毁。这意味着当您的函数返回时,您的 nstr 变量已经超出范围。

这会导致您的调用者,在本例中为 main,以对程序不再使用的内存的无效引用结束,这会触发所有各种错误和崩溃。

相反,您应该将第三个参数传递给您的函数,以便它作为新连接字符串的位置。我不认为在此处设置变量 static 是必要的,也不是一个好主意。没有必要在不应该​​的时候将某些东西保留在内存中。

更新代码

基于此,您的代码应该看起来更像这样

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

void strcpy2 (char str1[], char str2[], char str3[])
{
// ...
}

int main(void)
{
char str1[10] = "Hello";
char str2[10] = ",friends";
char str3[20];
strcpy2(str1, str2, str3);
puts(str3);
return 0;
}

你应该可以从这里拿走它。

更新 - 为什么你不应该在这里使用 static

许多人建议在这里使用 static 关键字。出于以下原因,我建议不要这样做。对局部变量使用 static 会使您的函数成为:

  1. 不是线程安全的:静态变量是共享变量;
  2. 不可 可重复使用: 函数中断尝试使用比您的玩具示例更长的字符串,上限为 19+1 个字符,包括 null 并首先违背了拥有功能的目的;
  3. 内存高效:静态变量将保留在内存中,带有一个字符串,在程序退出之前不再需要使用该字符串

如果您将第三个参数作为目标传递,并且已经有足够的空间来包含要连接的原件,那么您将拥有质量更好的函数。

您可以返回一个经过malloc 处理的指针,但是请注意,这有点危险,使用您的函数的每个人都需要更加小心。例如,每个客户都必须清楚地知道,他们现在有责任释放您的函数返回的内存。这可能更容易出错,因为 malloc 不会立即对使用它的人可见。 (忘记 free 函数的内部/不可见的 malloc?糟糕!你好,内存泄漏!)

一般来说,使用第三个参数应该更安全。

您真的应该花时间了解这些决定带来的副作用和后果。

关于c - 试图将 2 个字符串组合成一个新的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637036/

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