假设我必须创建一个分配在堆上的结构数组,并返回一个指向该结构数组的指针。
typedef struct Pair {
int x;
int y;
} Pair;
Pair** foo(int n, int m, int length)
{
Pair* arr = malloc(sizeof(*arr) * length);
for (int i = 0; i < length; ++i) {
arr[i].x = n++;
arr[i].y = m++;
}
return &arr;
}
当我编译包含此函数的程序时,它警告我正在返回局部变量的地址。我假设这是因为指针是在函数内初始化的(即在堆栈上),因此它算作局部变量。
当我编译它时,忽略这个警告并运行它,当访问返回的指针时程序崩溃。
我试过动态分配指针:
Pair** ptr = malloc(sizeof(**ptr));
ptr = &arr;
...
return ptr;
但是访问这个指针时程序还是崩溃了。如何在函数内创建此数组并返回指向此数组的指针,以便可以安全地访问它?
最佳答案
这个数组是在堆栈上初始化的,但是指针 (arr
) 是一个局部变量,所以调用者 main
不能访问它。您不需要使用指针的地址。您可以使用指针本身访问数组。
Pair* foo(int n, int m, int length)
{
Pair* arr = malloc(sizeof(*arr) * length);
for (int i = 0; i < length; ++i) {
arr[i].x = n++;
arr[i].y = m++;
}
return arr;
}
关于c - 返回指向结构数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51529820/