C 向函数发送指针
在C语言中,我试图通过发送指向独立函数的指针来为结构分配内存。我知道分配内存需要malloc(),但我对这个过程有点困惑 如果我有一个函数: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将丢失,现在出现
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);