C 将动态创建的结构作为非指针对象返回

C 将动态创建的结构作为非指针对象返回,c,pointers,malloc,C,Pointers,Malloc,在这段代码中,SMPTR s作为指针返回,我想作为非指针返回这个变量。在这里,我在动态内存中创建了一个结构,这样它就永远不会超出范围。这就是为什么到处都有很多指针。从函数返回对象时我看到的问题 您在\u SMPTRC中有三个对malloc的调用。找出哪些代码负责释放这些内存是很重要的。否则,您的代码将泄漏内存 调用函数将获得对象的二进制副本。您将有两个SMPTR对象指向动态分配的内存(shv和MBLOC)。你必须想出一个释放它们指向的内存的策略 调用函数将无法释放\u SMPTRC中为s分配的内

在这段代码中,SMPTR s作为指针返回,我想作为非指针返回这个变量。在这里,我在动态内存中创建了一个结构,这样它就永远不会超出范围。这就是为什么到处都有很多指针。

从函数返回对象时我看到的问题

  • 您在
    \u SMPTRC
    中有三个对
    malloc
    的调用。找出哪些代码负责释放这些内存是很重要的。否则,您的代码将泄漏内存

  • 调用函数将获得对象的二进制副本。您将有两个
    SMPTR
    对象指向动态分配的内存(
    shv
    MBLOC
    )。你必须想出一个释放它们指向的内存的策略

  • 调用函数将无法释放
    \u SMPTRC
    中为
    s
    分配的内存。你会有内存泄漏。这可以通过使用
    s
    对象而不是从
    malloc
    获取内存的指针来轻松解决


  • 如果您找出哪个代码块负责动态分配内存,则可以解决这些问题。你只需要意识到这些问题。

    你的需求是不兼容的。如果按值返回struct,则返回值必须具有自动存储持续时间。您必须从两个选项中选择一个

    这两种设置都很好,但您没有提供足够的详细信息来说明哪种设置更适合您的程序:

    //Smart pointer structure with built-in length and blocksize
    
    typedef struct SMPTR_H_VAR
    {
        UINT H_SMPTR_LEN;
        UINT H_SMPTR_BSZ;
    } SMPTR_H_VAR;
    typedef struct SMPTR
    {
        void *MBLOC;
        SMPTR_H_VAR *shv;
        const UINT *const BLOCL;
        const UINT *const BLOCSZ;
    } SMPTR;
    
    //Smart pointer strucure 'constructor'
    SMPTR *_SMPTRC(UINT var_sz, UINT var_num)
    {
        /*            
        // SMPTR structure
        //
        // Memory block casted to void *
        // SMPTR_H_VAR structure
        // const UINT *const BLOCL variable, used as a reference length variable for the 'Memory block' above
        // const UINT *const BLOCSZ variable, used as a reference size variable, 'in bytes', for the size of the 'Memory block' above
        */
    
        //Creation and initialization is done dynamically, to prevent the rise of bad pointers.
    
        SMPTR *s = (SMPTR *)malloc(sizeof(SMPTR));
        SMPTR_H_VAR *shv = (SMPTR_H_VAR *)malloc(sizeof(SMPTR_H_VAR));
    
        //SMPTR_H_VAR variables are set through the SMPTR pointer
        s->shv;
        s->shv->H_SMPTR_LEN = var_num;
        s->shv->H_SMPTR_BSZ = var_sz * var_num;
    
        s->MBLOC = malloc(var_sz * var_num);
        s->BLOCL = &shv.H_SMPTR_LEN;
        s->BLOCSZ = &shv.H_SMPTR_BSZ;
    
        return s;
    }
    


    为什么不直接按值返回结构呢?还有:,“我想以非指针的形式返回这个变量。”因为?如何解决这个问题:
    s->shv(不执行任何操作),将其更改为:
    s->shv=shv
    在放弃动态内存管理之前。如果不将其作为指针返回,则只需按值返回,即根本不需要malloc。缺点是,只要将整个结构作为函数参数传递,就会创建它的浅拷贝。但除此之外,我看不出有什么理由不在堆中分配,并像现在这样作为指针传递。你能解释一下第三点吗?为什么您认为无法释放分配的内存?@Groo调用函数将通过复制获得值
    *s
    。它不会得到
    malloc
    返回的指针。得到了,我以为你在谈论上面发布的OP代码段。
    S foo(void)
    {
         S s;
         s.field = 1;
         return s;
    }
    
    int main(void)
    {
         S s = foo();
         printf("%d\n", s.field);
    }
    
    S *foo(void)
    {
         S *s = malloc(sizeof *s);
         s->field = 1;
         return s;
    }
    
    int main(void)
    {
         S *s_ptr = foo();
         printf("%d\n", s_ptr->field);
         free(s_ptr);
    }