我正在尝试在堆上创建一个结构 - 以便它可以在其他函数中使用,但我似乎无法克服以我可以传递它的方式创建结构本身的第一个障碍用指针。我知道字段数组已正确初始化为 5 × 5,并且我可以获得指向 fieldz 结构的指针 (*f),但是当我尝试将其传递回 main 时,没有任何结果。我需要保留 field_t * f = makeField(w,h);事实上,我觉得我错过了一些明显的东西。
谢谢!
struct _field_t {
int ** field;
int width;
int height;
};
typedef struct _field_t field_t;
field_t * makeField(int w, int h){
field_t fieldz;
fieldz.width = w;
fieldz.height = h;
int ** fieldz = malloc(h * sizeof(* fieldz));
for(int y = 0; y < h; y++){
int * row = malloc(w * sizeof(* row));
fieldz[y] = row;
for(int x = 0; x < w; x++){
row[x] = -1;
}
}
fieldz.field = field;
field_t * f = &fieldz;
return f;
}
int main() {
int h = 5;
int w = 5;
field_t * f = makeField(w, h);
return 0;
}
最佳答案
(这个答案将忽略拼写错误int **fieldz
)
返回指向局部变量的指针是一个很大的禁忌。我不打算详细说明,因为这已经解释过很多次了(Google、bing 和 duck-duck-go 是你的 friend )
基本上有三种方法可以让函数创建结构体
1 - Malloc 结构并返回指向它的指针:
field_t * makeField(int w, int h)
{
field_t *f = malloc(sizeof (*f))
f->width = w;
f->height = h;
f->field = .....;
return f;
}
.....
field_t *f = makeField(50, 50);
2 - 让调用者分配内存并将指针传递给要初始化的结构
field_t * makeField(field_t *f, int w, int h)
{
f->width = w;
f->height = h;
f->field = .....;
return f;
}
.....
field_t f1;
makeField(&f1, 50, 50);
field_t *f2 = malloc(sizeof(*f2));
makeField(f2, 50, 50);
3 - 让调用者分配内存并分配由 makeField
创建的结构的副本
field_t makeField(int w, int h)
{
field_t f;
f.width = w;
f.height = h;
f.field = .....;
return f;
}
.....
field_t f1 = makeField(50, 50);
field_t *f2 = malloc(sizeof(*f2));
*f2 = makeField(50, 50);
您使用哪种方法取决于需求和个人喜好。就我个人而言,我更喜欢在可能的情况下让调用者分配内存。调用者通常更清楚堆栈、堆或其他东西是否更合适
关于c - 如何正确传递指向结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52999708/