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

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

void replaceNumberAndPrint(int array[3]) {
    printf("%in", array[1]);
    printf("%in", 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函数)中声明数组,或者将它分配到堆上。 如果你在堆上分配它,你需要手动释放它,或者使用RAII在C ++中释放它。

我错过了一个替代方案(可能甚至是这里最好的一个,只要数组不是太大)就是将你的数组包装到一个结构中,从而使它成为一个值类型。 然后返回它创建一个幸存的函数返回的副本。 有关详细信息,请参阅tp1的答案。


一旦超出范围,您将无法访问本地变量。 这就是说它是一个局部变量。

当您在replaceNumberAndPrint函数中访问数组时,结果是未定义的。 它似乎第一次工作的事实只是一个幸运的巧合。 可能您指向的内存位置在堆栈上未分配,并且仍然为第一次调用正确设置,但对printf的调用将在其操作期间通过将值压入堆栈来覆盖此值,这就是为什么第二次调用printf会显示某些内容不同。

您需要将数组数据存储在堆上并传递一个指针,或者保存在一个范围内的变量(例如全局函数或主函数内的某个范围)。


尝试类似的东西。 如果它在本地定义,则“杀死” myArray

#include <stdio.h>
#include <stdlib.h>

void replaceNumberAndPrint(int * array) {
 printf("%in", array[0]);
 printf("%in", array[1]);
 printf("%in" , array[2]);
 free(array);
}

int * getArray() {
 int * myArray = malloc(sizeof(int) * 3);
 myArray[0] = 4;
 myArray[1] = 64;
 myArray[2] = 23;
 //{4, 65, 23};
 return myArray;
}

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

更多信息:http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/

编辑:正如评论正确指出:一个更好的方法来做到这一点将是:

#include <stdio.h>
#include <stdlib.h>

void replaceNumberAndPrint(int * array) {
    if(!array)
        return;

    printf("%in", array[0]);
    printf("%in", array[1]);
    printf("%in" , array[2]);
}

int * createArray() {
    int * myArray = malloc(sizeof(int) * 3);

    if(!myArray)
        return 0;

    myArray[0] = 4;
    myArray[1] = 64;
    myArray[2] = 23;
    return myArray;
}

int main() {
    int * array = createArray();
    if(array)
    {
        replaceNumberAndPrint(array);
        free(array);
    }
    return 0;
}
链接地址: http://www.djcxy.com/p/36331.html

上一篇: How to access a local variable from a different function using pointers?

下一篇: What's the scope of a variable initialized in an if statement?