C语言 发送指向函数的指针



在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);

但是,如何以另一种方式完成呢?

你可以这样做:

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 =...说"为该地址指向的指针分配一个地址"。

然后要调用它,您需要传递要设置的指针的 ADDRESS:

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

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

指针是值(通常适合一个单词或寄存器,在你的机器中)。

总是初始化指针(也许是NULL)是一个好习惯。

allocate 这样的函数,它接受一些指针并立即替换该指针,正在丢失原始指针的值。

顺便说一句,你可能有一个

  typedef struct somestruct_st structure;

我更喜欢structure_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,也不喜欢传递指针的地址。

例如,

如果您被定义为这样的结构类型

   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)); 
        }
void allocate(structure *ptr){
     ptr = malloc(sizeof(ptr)); //ptr assigned memory block address 
}

在这里,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);

相关内容

  • 没有找到相关文章

最新更新