c++ - 如何使用指针从不同的函数访问局部变量?

标签 c++ c pointers local-variables

我可以访问不同函数中的局部变量吗?如果是这样,怎么办?

void replaceNumberAndPrint(int array[3]) {
    printf("%i\n", array[1]);
    printf("%i\n", array[1]);
}

int * getArray() {
    int myArray[3] = {4, 65, 23};
    return myArray;
}

int main() {
    replaceNumberAndPrint(getArray());
}

上面这段代码的输出:

65
4202656

我做错了什么? “4202656”是什么意思?

我是否必须在 replaceNumberAndPrint() 函数中复制整个数组才能比第一次更频繁地访问它?

最佳答案

myArray 是一个局部变量,因此指针仅在其作用域结束之前有效(在本例中是包含函数 getArray)。如果稍后访问它,您会得到未定义的行为。

实际上,对 printf 的调用会覆盖 myArray 使用的堆栈部分,然后它包含一些其他数据。

要修复代码,您需要在生命周期足够长的作用域中声明数组(示例中的 main 函数),或者在堆上分配它。如果您在堆上分配它,则需要手动释放它,或者在 C++ 中使用 RAII。

我错过的一个替代方案(可能是这里最好的一个,前提是数组不是太大)是将数组包装到一个结构中,从而使其成为一种值类型。然后返回它会创建一个在函数返回后仍然存在的拷贝。请参阅tp1answer有关详细信息。

关于c++ - 如何使用指针从不同的函数访问局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49440103/

相关文章:

c++ - CUDA 缩减 - 竞争条件?

c++ - 我可以在相同的设备缓冲区上一个接一个地调用 OpenCL 内核吗?

c - Keil 中定义的 __wfi() 等特定于 Cortex 的函数在哪里?

c - 在带链表的递归函数中使用 rand()

c - 为什么我不能在 C 中将 'char**' 转换为 'const char* const*'?

c++ - 我如何从 boost::streambuf 读取指针数据但没有复制数据

c++ - 如何打印出对的多集元素

c - 为什么我从 scanf 循环中收到段错误?

c - 在 Windows 上设置 OpenGL(mingw32?)

c++ - 如何评估指针和reinterpret_cast?