gpt4 book ai didi

c++ - 从函数返回 char*

转载 作者:IT老高 更新时间:2023-10-28 22:26:48 25 4
gpt4 key购买 nike

以下是 3 个功能。 main() 按预期打印出来。现在,我猜在 mycharstack() 中,字符串存储在堆栈中,因此当“ch”超出范围时,它应该无法返回字符串。它是如何正常工作的?我猜存储在 mychar() 中的字符串也在堆栈上。它应该正常工作吗?我猜代码中还有其他错误和内存泄漏,如果有请告诉我。我可以用 std::string 做这些更清洁和更容易的事情。但我想了解 char* 是怎么回事。

#include <iostream>
using namespace std;

char* mychar()
{
return "Hello";
}

char* mycharstack()
{
char* ch = "Hello Stack";
return ch;
}

char* mycharheap()
{
char* ch = new char;
ch = "Hello Heap";
return ch;
}

int main()
{
cout << "mychar() = " << mychar() << endl;
cout << "mycharstack() = " << mycharstack() << endl;
cout << "mycharheap() = " << mycharheap() << endl;

system("PAUSE");
return 0;
}

最佳答案

在 C++ 中,字符串处理不同于例如 pascal。

char* mycharheap()
{
char* ch = new char;
ch = "Hello Heap";
return ch;
}

执行以下操作:

  1. char* ch = new char; 为 ONE 字符创建内存,并将其分配给变量 ch
  2. ch = "Hello Heap"; 分配给变量 ch 指向只读内存的指针,其中包含字节 "Hello Heap\0"。另外,变量ch的原始内容丢失,导致内存泄漏。
  3. return ch;返回存储到变量ch的指针。

你可能想要的是

char* mycharheap()
{
char* ch = new char[11] /* 11 = len of Hello Heap + 1 char for \0*/;
strcpy(ch, "Hello Heap");
return ch;
}

注意 strcpy -> 你在 ch 中有内存,它有 11 个字符的空间,你正在用只读部分的字符串填充它内存。

在这种情况下会有泄漏。写入后需要删除内存,如:

char* tempFromHeap = mycharheap();
cout << "mycharheap() = " << tempFromHeap << endl;
delete[] tempFromHeap;

但是,我强烈不建议这样做(在被调用者中分配内存并在调用者中删除)。对于这种情况,有例如 STL std::string,另一种常见且更合理的方法是在调用者中分配,传递给被调用者,用结果“填充”内存,然后在再次来电。

导致未定义行为的原因如下:

char* mycharstack()
{
char[] ch = "Hello Heap"; /* this is a shortcut for char[11] ch; ch[0] = 'H', ch[1] = 'e', ...... */
return ch;
}

这将使用字节“Hello Heap\0”在堆栈上创建数组,然后尝试返回指向该数组第一个字节的指针(在调用函数时,它可以指向任何东西)

关于c++ - 从函数返回 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379328/

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