输出参数是否违反了返回本地引用的原则?

时间:2011-09-17 15:08:08

标签: c pointers

我有这段代码:

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

void getDataFromServer(OUT int** array, OUT int* size)
{
    int tmpArr[] = {0x00, 0x01, 0x02, 0x03,  0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
                        0x10, 0x11, 0x12, 0x13,  0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
    *size = sizeof tmpArr / sizeof(int);
    *array = tmpArr;
}

int main(void)
{
    int size = 0;
    int* dataFromServer;
    getDataFromServer(&dataFromServer, &size);

    int x;
    for (x=0; x < size; x++)
        printf("%d ", dataFromServer[x]);
    printf("\n\n");

    return 0;
}

main中的for循环打印垃圾数据。这是因为OUT int** array参数访问函数本地的数据吗?

感谢。

3 个答案:

答案 0 :(得分:3)

是的,无论你怎么做,都不能从函数中发送局部变量的地址,并且一旦函数返回它就会继续有效。相同的参数适用于函数返回值或“out参数”,或者通常将任何内存位置设置为指向局部变量。

经常说变量从堆栈中删除,或变成“垃圾”;它有助于意识到实际发生的是空间被重用于其他函数的局部变量,用于调用其他函数的参数等。这就是为什么有时“垃圾”变量似乎仍然有效 - 因为他们的空间还没有被重用。

答案 1 :(得分:2)

是的,确切地说。由于tmpArrgetDataFromServer的本地,因此当函数返回时它不再存在。指向它的指针现在是指向垃圾的指针。

您应该考虑谁负责分配内存以保存服务器中的数据以及谁负责释放数据。在这种情况下,函数负责释放它,这显然是行不通的。任何一方都可以分配,但来电者必须免费!

答案 2 :(得分:1)

getDataFromServer退出时,所有局部变量都会从堆栈中弹出。你正在使用的指针现在指向一个或多或少被消灭的内存区域。使用malloc并将数据复制到新分配的内存(在堆上),或将tmpArr复制到static变量中。