我有一个结构,例如:
typedef struct{
int num;
} S, *Sp;
现在,我想要做的是创建这种类型的指针(不分配内存),将函数作为参数传递给函数,并在函数内部分配内存等。
之类的东西void foo(Sp p){
p = malloc.....
p->num = ....
}
然后在主要做这样的事情:
Sp new = NULL;
foo(new);
但是foo完成后'new'仍然是NULL,就像从未分配过一样。我觉得我在这里做错了什么。 (这是硬件分配的一小部分,我无法更改功能定义。)
答案 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函数名中使用new
或delete
,因为稍后您可能希望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 );