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