将指针作为函数参数返回

时间:2014-08-29 18:42:39

标签: c function pointers

我有一个结构,例如:

typedef struct{
    int num;
} S, *Sp;

现在,我想要做的是创建这种类型的指针(不分配内存),将函数作为参数传递给函数,并在函数内部分配内存等。

之类的东西
void foo(Sp p){
    p = malloc.....
    p->num = ....
}

然后在主要做这样的事情:

Sp new = NULL;
foo(new);

但是foo完成后'new'仍然是NULL,就像从未分配过一样。我觉得我在这里做错了什么。 (这是硬件分配的一小部分,我无法更改功能定义。)

3 个答案:

答案 0 :(得分:1)

你应该明白,在C中,参数传递by value(不是通过引用)。因此,当函数更改形式参数时,调用函数中不会发生任何更改。因此,传递指针的地址。

void foo(S**pp) {
 *pp = malloc(sizeof(S));
 if (!*pp) { perror("malloc"); exit(EXIT_FAILURE); };
 // fill *pp
}

并致电

S* ptr;
foo (&ptr);

实际上,让构建函数返回指针更为常见:

S* make_s(void) {
  S* p = malloc(sizeof(S));
  if (!p) { perror("malloc"); exit(EXIT_FAILURE); };
  // fill p
  return p;
}

然后致电

S* ptr = make_s ();

重要的是要记录关于谁应该free指针的约定。如果分配的结构包含内部指针,则创建一个例程delete_s,它释放内部指针和整个尖头结构。

顺便说一句,避免使用typedef作为指针(比如你的Sp),你真的想知道什么是指针一目了然。不要在公共C函数名中使用newdelete,因为稍后您可能希望C ++代码包含头文件。

答案 1 :(得分:0)

void foo(Sp *p){
    *p = malloc.....
    *p->num = ....
}

然后

Sp new = NULL;
foo(&new);

如果你想将函数的原型保持为void foo(Sp p),你必须去:

Sp new = (Sp) malloc(sizeof(S));
foo(new);

答案 2 :(得分:0)

如果您无法更改函数声明,则需要在main中为结构分配内存。

void foo(Sp ptr){
    ptr->num = ....
}

主要:

Sp itemPtr = malloc...;
foo( itemPtr );

或者主要是:

S item;
foo( &item );