c - 在结构中使用指针

标签 c struct

假设我有以下内容:

#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/

相关文章:

c - 如何在 C 中封装这样的函数?

c - 重置/清除指向结构的全局指针数组

c - 一些初学C的问题

C 编程——如何将文本文件内容放入我的数组中?

c - 数组中的模式出现

用信号清除动态分配的数据

c - 在C中对链表中的队列元素进行排序

c - rename() 在 Win XP 下不能在 C 中工作

C 段错误 : memory altered between functions strcmp

go - 如何初始化特定的结构格式