gpt4 book ai didi

c++ - 为什么从函数返回时需要将数组声明为静态数组。 (C++)

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

我已经知道 static 存储类允许局部变量在程序运行期间保持存在。

我想知道为什么需要将 digits[3] 数组声明为静态数组。如果我不将其声明为静态,除了编译错误外,会发生什么情况。

附言我在处理 C++ 中的指针或内存地址方面还很陌生。

尽管我对 C++ 中有关范围的堆栈内存分配有一些想法。

int* getDigits(int input)
{
const int TEN = 10;
int toStore;
int digits[3]; /* this array (static) */
for (int i = 0; i < 3; ++i)
{
toStore = input % TEN;
digits[i] = toStore;
input = input / TEN;
}
return digits;
}

int main(int argc, char const *argv[])
{
int* ptr;
ptr = getDigits(123);
for (int i = 0; i < 3; ++i)
{
std::cout << *( ptr+i ) << std::endl;
}

return 0;
}

最佳答案

您正在返回一个指向函数本地数组的指针。如果您将其声明为 static ,这意味着数组的生命周期一直延长到程序结束,因此调用代码可以取消引用从函数返回的指针。如果您不将其声明为 static ,它是一个“自动”变量,其生命周期在 block (函数体)结束时结束,因此取消引用返回的数据指针是未定义的行为。

无论如何,这些都不是典型的正确解决方案。一方面,如果该函数被调用两次,则第二次调用可能会更改第一个结果指向的数据。一个更典型的解决方案是让函数返回一个指针(可能是 shared_ptrunique_ptr )到使用 new int[3] 动态分配的数组。 .另一种解决方案是让函数创建并返回 std::array<int, 3> , 这是一个可以按值返回的合适的类类型(只有 C 风格的数组不能很容易地从函数中按值返回)。

关于c++ - 为什么从函数返回时需要将数组声明为静态数组。 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45736922/

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