3

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

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

4

4 回答 4

2

You can do it this way:

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

So when you want to return a value in a parameter, you need to pass that variable's address in, then assign the value to what that address points to. Since, in this case, the variable is a pointer, you are passing in the address of a pointer or, in other words, a pointer to a pointer. Then the assignment *ptr =... says to "assign an address to the pointer that this address points to".

Then to call it, you pass the ADDRESS of the pointer you want to be set:

structure *my_ptr;

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

The important thing to remember in this case is that you are passing the location of the pointer, not the location of the data that the pointer is pointing to.

于 2013-09-05T17:23:20.177 回答
1

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

   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)); 
        }
于 2013-09-05T17:24:47.857 回答
1
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);
于 2013-10-10T07:50:01.677 回答
1

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

总是初始化指针(也许是)是一个好习惯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也不喜欢传递指针的地址。

于 2013-09-05T17:17:16.690 回答