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