c - 如何正确传递指向结构的指针

标签 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;
}

最佳答案

(这个答案将忽略拼写错误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/

相关文章:

python - 在 Fedora 上设置 OpenGL

c - 在 C 中多次声明一个函数有什么意义?

C 编程错误 : Reading from a . txt 文件

c++ - 为什么我必须初始化一个数组?

c - 如何在使用标准 C 拒绝无效数字的同时将罗马数字转换为 int?

c++ - C 中的泛型指针和 C++ 中的泛型指针有哪些区别?

c - 如何让 Komodo Edit 7 自动完成 C?

c - 使用C在Linux中通过串口从SIM读取短信

c - 在 C 中以间隔执行特定语句,而其他语句保持运行

c++ - 如何通过 C++ 中的按地址传递将 scanf 字符串传递给全局字符数组?