我可以用其他函数访问局部变量吗?如果是,怎么做?

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++来释放它.

我错过的另一个 Select (如果数组不太大,可能是这里最好的 Select )是将数组包装到 struct 中,从而使其成为值类型.然后返回它会创建一个在函数返回后仍然存在的副本.有关详细信息,请参见tp1's answer.

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

通过MQTT/蚊子发送大文件—限制在4MB

在C中使用JMP_buf数组进行线程化(在xv6中测试)

如果我释放其他内容,返回值就会出错

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

C是否用0填充多维数组的其余部分?

C++中矢量类型定义和数据保护的高效解决方案

如何将字符**传递给需要常量字符指针的常量数组的函数

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

使用错误的命令执行程序

为什么此共享库没有预期的依赖项?

C:在编译时构建和使用字符串文字的预处理器宏?

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

覆盖读取函数,但当文件描述符为3或4时,我有问题

为四维数组中的Dim-1和Dim-3重新分配空间

如何组合两个宏来初始化C语言中的字符串数组?

C中的char**v*char[]

如何编写postgresql支持函数

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题