4

我的问题是指 C 指针的主题。想象以下场景:我有一个名为“stc”的结构变量,定义如下:

struct stc {
       int data;
       char ch;
}

在我的程序的 Main() 函数的开头声明。我想使用函数设置结构中的字段(即data)的值。

现在我的问题是以下哪个约定更好,为什么?

约定 1: 编写一个返回类型为stc的指针的函数:

struct stc *func(int d, char c)
{
    stc *tmp = malloc(sizeof(stc))
    tmp -> data = d;
    tmp -> ch = c;

    return tmp;
}

稍后在不再需要该结构时释放分配的内存。

约定2:编写一个函数,接收指向该结构的指针,并将stc的地址发送给它

void func(stc *stcP, int d, char c)
{
     stcP -> data = d;
     stcP -> ch = c;
}

非常感谢!

4

3 回答 3

5

第一次使用可能会导致内存泄漏而不小心。

第二种用法比较好,但是你错误地使用了箭头操作符,应该是:

void func(stc *stcP, int d, char c)
{
    stcP -> data = d;
    stcP -> ch = c;
}
于 2013-09-05T12:07:23.153 回答
4

我会两者都有,或者它的变体:

typedef struct stc stc;


#define STC_INITIALIZER(D, C) { .data = d, .ch = c, }

stc* stc_init(stc *stcP, int d, char c) {
  if (stcP) {
     *stcP = (stc)STC_INITIALIZER(d, c);  // Initialize with a compound literal
  }
  return stcP;
}

stc* stc_allocate(int d, char c) {
  return stc_init(malloc(sizeof(stc)), d, c);
}

因此,这样做的好处是您可以对ed 对象使用与其他变量相同的init函数。malloc

另请注意,您的代码中有错误,在 C 中,除非您stc事先使用,否则您无法使用。structtypedef

于 2013-09-05T12:20:20.183 回答
2

第一种类型更容易出现内存泄漏。从分配内存的地方释放内存是一种更好的做法。第二种方法看起来很简洁,并且void func(stc *stcP, int d, char c)完成了初始化结构的预期任务。

于 2013-09-05T12:25:03.190 回答