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/59559851/

相关文章:

c - 方法的堆栈帧被删除但局部变量值仍然可以访问?

c - 两次将指针转换为 `void*` 怎么会无效?

c++ - 通过 SOCKS 代理发送 UDP 数据包

c++ - `inline` 和 `template<class = void>` 之间有什么实际区别?

c - 跨多个包含文件使用函数

C++ 访问二维数组指针处的值

c++ - 如何将 C++ 结构转换为数据库

c++ - 如何在不使用 ide 的情况下为 MinGW 安装 allegro 5?

c - 初始化时字符串的奇怪格式

c - 在 C 中交换 unsigned long(8 字节)内的字节