C 向函数发送指针

C 向函数发送指针,c,pointers,memory,malloc,structure,C,Pointers,Memory,Malloc,Structure,在C语言中,我试图通过发送指向独立函数的指针来为结构分配内存。我知道分配内存需要malloc(),但我对这个过程有点困惑 如果我有一个函数: void allocate(structure *ptr){ ptr = malloc(sizeof(ptr)); //ptr assigned memory block address } 我正在分配一个与结构大小相等的内存块,但只分配给发送给函数的原始指针的副本。当函数将控制权返回给调用函数时,ptr将丢失,现在出现

在C语言中,我试图通过发送指向独立函数的指针来为结构分配内存。我知道分配内存需要malloc(),但我对这个过程有点困惑

如果我有一个函数:

    void allocate(structure *ptr){
        ptr = malloc(sizeof(ptr)); //ptr assigned memory block address 
    }
我正在分配一个与结构大小相等的内存块,但只分配给发送给函数的原始指针的副本。当函数将控制权返回给调用函数时,ptr将丢失,现在出现内存泄漏

本质上,我试图做的是向函数发送一个结构类型的指针,并为该结构分配内存


我知道这可以通过以下方式实现:

    structure *allocate(structure *ptr) 
当通话受到以下因素的影响时:

    some_struct_ptr = allocate(some_struct_ptr);
但是,如何用另一种方法来实现呢?

是值(通常适合于机器中的一个字或寄存器)

总是初始化指针(可能是指向
NULL
)是一个好习惯

像您的
allocate
这样的函数,它获取某个指针并立即替换该指针,但该指针正在丢失原始指针的值

顺便说一句,你可能有

  typedef struct somestruct_st structure;
我更喜欢
structure\u t
而不是
structure
作为类型名

所以基本上,你的函数的行为就像

 void allocate(structure *ptrold){
    /// ptrold is never used in this function
    structure* ptr = malloc(sizeof(ptr));
}
除非您使用本地
ptr
执行某些操作,否则您的功能将被禁用。您可能应该返回该
ptr
,或者将其放入某个位置(可能是某个结构中的内存字段或某个全局变量)

一种可能的方法是传递指针的地址,即指向指针的指针

  void allocate (structure **pptr)
  {
     structure *oldptr = *pptr;
     /// etc...
  }
当然,在这种情况下,您将调用
allocate(&someptr)


我的建议是以一种风格处理指针:避免修改它们,只需重新分配它们:因此我不喜欢
realloc
,也不喜欢传递指针的地址。

您可以这样做:

void allocate( structure **ptr )
{
     // Allocate memory for a single structure and put that address into the location
     // that ptr points to. ptr is assumed to be the address of the pointer given
     // by the caller

     *ptr = malloc( sizeof(structure) );
}
因此,当您想要在参数中返回一个值时,您需要传入该变量的地址,然后将该值分配给该地址所指向的对象。因为在本例中,变量是指针,所以您要传入指针的地址,或者换句话说,指向指针的指针。然后赋值
*ptr=…
表示“为该地址指向的指针分配一个地址”

然后,要调用它,请传递要设置的指针的地址:

structure *my_ptr;

// Put something useful in my_ptr, like the address of memory that will hold a structure
allocate( &my_ptr );

在这种情况下,需要记住的重要一点是,您传递的是指针的位置,而不是指针指向的数据的位置。

例如,如果您定义了这样的结构类型

   typedef struct abc
    {
    int a;
    char name[20];
    }abc_t;

   int  main()
    {
    abc_t *ptr=NULL;
    allocate(&ptr); // you are passing address of pointer , call by reference   
                    //things gets effected which made in function.
    }
您需要分配
abc\t
类型的对象所需的字节数。要将内存分配给函数中的指针,您需要使用双指针定义函数

 void allocate(abc_t **ptr) 
        {
        *ptr=(abc_t *)malloc(sizeof(abc_t)); 
        }
这里,ptr是指向结构的指针。它存储共同构成类“结构”的一组元素的地址。因此sizeof(ptr)将返回用于存储结构地址的字节数,而不是结构本身的大小。因此,要分配内存来存储1个结构单元,您需要将语句修改为

void allocate(structure *ptr){
     ptr = malloc(sizeof(structure)); //ptr assigned memory block address 
}
此外,为了实现您所说的,通过维护函数“void”的返回类型,您可以使用函数调用的引用调用机制

void allocate(structure **ptr){
     *ptr = malloc(sizeof(structure)); //ptr assigned memory block address 
}
来电者应将其称为

allocate(&ptr);

我理解这个方法中的“与”符号的功能,但实际发生了什么?我请求指向某个指针(*ptr)的指针(*),因此需要语法(**ptr)。我理解这部分。所以,当我写
*ptr=malloc…
时,我们基本上是将内存块的地址分配给指针指向的任何对象吗?也就是说,由于&my_ptr指向my_ptr,我们正在取消引用&my_ptr并将存储在my_ptr中的值指定为内存块地址?@sherrellbc我更新了我的描述,并做了更多解释,看看这是否有帮助。你能解释一下为什么不能简单地返回指向已分配内存的指针吗?
allocate(&ptr);