Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 输出参数是否被认为违反了返回本地引用的原则?_C_Pointers - Fatal编程技术网

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

C 输出参数是否被认为违反了返回本地引用的原则?,c,pointers,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,

我有以下代码:

#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;
}
#包括
#包括
#界定
void getDataFromServer(OUT int**数组,OUT int*大小)
{
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};
*尺寸=tmpArr的尺寸/sizeof(整数);
*数组=tmpArr;
}
内部主(空)
{
int size=0;
int*dataFromServer;
getDataFromServer(&dataFromServer,&size);
int x;
对于(x=0;x
主内存中的for循环打印垃圾数据。。这是因为函数本地的
OUT int**array
参数访问数据吗


谢谢。

是的,没错。由于
tmpArr
对于
getDataFromServer
是本地的,因此当函数返回时,它将不再存在。指向它的指针现在是指向垃圾的指针


您应该考虑谁负责分配内存来保存服务器上的数据,谁负责释放数据。在这种情况下,函数负责释放它,这显然无法工作。任何一方都可以分配,但调用方必须释放

没错。由于
tmpArr
对于
getDataFromServer
是本地的,因此当函数返回时,它将不再存在。指向它的指针现在是指向垃圾的指针


您应该考虑谁负责分配内存来保存服务器上的数据,谁负责释放数据。在这种情况下,函数负责释放它,这显然无法工作。任何一方都可以分配,但调用方必须释放

是的,无论您如何操作,都不能将局部变量的地址发送到函数外,并期望它在函数返回后继续有效。相同的参数适用于函数返回值或“out参数”,或者,通常,将任何内存位置设置为指向局部变量


人们常说,变量从堆栈中移除,或者变成“垃圾”;这有助于认识到实际发生的情况是,空间被重用用于其他函数的局部变量、用于调用其他函数的参数等。这就是为什么有时“垃圾”变量看起来仍然有效的原因,因为它们的空间尚未被重用

是的,无论您如何操作,都不能将局部变量的地址发送到函数外,并期望它在函数返回后继续有效。相同的参数适用于函数返回值或“out参数”,或者,通常,将任何内存位置设置为指向局部变量


人们常说,变量从堆栈中移除,或者变成“垃圾”;这有助于认识到实际发生的情况是,空间被重用用于其他函数的局部变量、用于调用其他函数的参数等。这就是为什么有时“垃圾”变量看起来仍然有效的原因,因为它们的空间尚未被重用

当退出
getDataFromServer
时,所有局部变量都从堆栈中弹出。您正在使用的指针现在指向内存中或多或少已被清除的区域。使用
malloc
并将数据复制到新分配的内存中(在堆上),或者将
tmpArr
设置为
static
变量

当退出
getDataFromServer
时,所有局部变量都从堆栈中弹出。您正在使用的指针现在指向内存中或多或少已被清除的区域。使用
malloc
并将数据复制到新分配的内存中(在堆上),或者将
tmpArr
设置为
static
变量

还应注意的是,您无法依赖未被重用的空间。编译器可以将临时堆栈空间用于它想要的任何内容,这可能会随着编译器版本的变化而变化。此外,在代码运行时调用的任何异步信号处理程序都可以使用该堆栈,这将导致难以跟踪竞争条件错误。原则上,我认为内核甚至可以在进程未计划运行时使用堆栈来记录自己的进程状态,这将是竞争条件的另一个来源……还应该注意的是,您无法依赖未被重用的空间。编译器可以将临时堆栈空间用于它想要的任何内容,这可能会随着编译器版本的变化而变化。此外,在代码运行时调用的任何异步信号处理程序都可以使用该堆栈,这将导致难以跟踪竞争条件错误。原则上,我认为内核甚至可以在进程未计划运行时将堆栈用于自己的进程状态簿记,这将是竞争条件的另一个来源。。。