假设我有以下内容:
#include <stdio.h>
typedef struct
{
int num;
} myObj;
typedef struct
{
myObj *obj_ptr;
} myStruct;
void populate(myStruct *m1)
{
m1->obj_ptr->num = 123;
}
int main()
{
printf("Hello World");
myStruct m1;
populate(&m1);
printf("%d", m1.obj_ptr->num);
return 0;
}
这段代码的目的是我想得到一个项目,例如m1
被填充而不是由 populate
函数返回,因此它的编码方式也是如此。
我担心 m1.obj_ptr->num
行,因为它看起来不是一个好的设计。即使我让它运行,这段代码是否有任何问题?对此有更好的方法吗?
最佳答案
在结构中有一个指针是可以的,但是你必须为它分配内存:
void populate(myStruct *m1)
{
m1->obj_ptr->num = 123;
}
是错误的,因为 m1->obj_ptr
没有被初始化。你可以这样做:
void populate(myStruct *m1)
{
// always check for validity of arguments
if(m1 == NULL)
return;
m1->obj_ptr = malloc(sizeof *m1->obj_ptr);
if(m1->obj_ptr == NULL)
return;
m1->obj_ptr->num = 123;
}
我个人会让 populate
成功返回 1,失败返回 0,因此
调用者知道分配是否成功。
但是你不必忘记释放内存:
int main()
{
printf("Hello World");
myStruct m1;
populate(&m1);
if(m1.obj_ptr)
printf("%d", m1.obj_ptr->num);
free(m1.obj_ptr);
return 0;
}
如果你说,你不想在populate
中分配内存,那么你必须
在调用 populate
之前初始化指针,如下所示:
int main()
{
printf("Hello World");
myStruct m1;
myObj obj;
m1.obj_ptr = &obj;
populate(&m1);
printf("%d", m1.obj_ptr->num);
return 0;
}
但这有一个缺点,就是你不能将这个结构返回给另一个 功能。这是不正确的:
myStruct get_me_a_struct(void)
{
myStruct m1;
myObj obj;
m1.obj_ptr = &obj;
populate(&m1);
return m1;
}
void foo(void)
{
myStruct m2 = get_me_a_struct();
printf("%d\n", m2.obj_ptr->num); // <-- you cannot do that
}
因为 m2.obj_ptr
会指向一个无效的位置。出于这个原因,使用
malloc
用于分配更好。
关于c - 在结构中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459699/