返回指向结构数组的指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回指向结构数组的指针相关的知识,希望对你有一定的参考价值。
假设我必须创建一个在堆上分配的结构数组,并返回指向此结构数组的指针。
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;
但是当访问此指针时程序仍然崩溃。如何在函数中创建此数组并返回指向此数组的指针,以便可以安全地访问它?
答案
如果需要指向结构数组的指针,可以将函数签名从Pair**
更改为Pair*
。
如果你仍然想要一个指针数组的指针,那么为Pair
的每个索引为arr
结构分配内存。
for(int i = 0; i < length; ++i){
arr[i] = malloc(sizeof(Pair));
...
}
你可以将&arr
声明为,而不是返回arr
Pair** arr = malloc(sizeof(Pair*) * length);
另一答案
此数组在堆栈上初始化,但指针(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;
}
另一答案
如果你想要一个结构数组,代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x;
int y;
} Pair;
static 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;
}
int main(void) {
Pair *z = foo(111, 222, 3);
for (int i = 0; i < 3; ++i)
printf("z[%d]= { %d, %d }
", i, z[i].x, z[i].y);
free(z);
return 0;
}
给出输出:
z[0]= { 111, 222 }
z[1]= { 112, 223 }
z[2]= { 113, 224 }
另一答案
因为arr
是一个局部变量,所以当foo
结束时它将是免费的。因此,您之后无法访问arr
。要解决这个问题,你应该在堆中声明数组指针:
Pair** foo(int n, int m, int length)
{
Pair ** arr = (Pair**)malloc(sizeof(Pair*));
*arr = malloc(sizeof(Pair) * length);
for (int i = 0; i < length; ++i) {
(*arr)[i].x = n++;
(*arr)[i].y = m++;
}
return arr;
}
以上是关于返回指向结构数组的指针的主要内容,如果未能解决你的问题,请参考以下文章