如何正确将指针传递给结构

时间:2018-10-26 00:07:16

标签: c

我正在尝试在堆上创建一个结构-以便可以将其用于其他功能,但是我似乎无法摆脱以自己可以传递它的方式创建结构本身的第一个障碍用指针。我知道字段数组已通过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;
}

1 个答案:

答案 0 :(得分:0)

(此答案将忽略错字int **fieldz

返回指向局部变量的指针是一个很大的禁止。我将不赘述,因为已经对此进行了很多次解释(Google,bing和duck-duck-go是您的朋友)

基本上有三种方法可以使函数创建结构

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);

您使用哪种方法取决于需求和个人喜好。我个人更喜欢在可能的情况下让调用者分配内存。调用者通常会更好地了解堆栈,堆或其他更合适的方式