因此,我试图通过在要写入的函数中分配内存来写入main
函数中声明的缓冲区,我注意到通过传递一个char指针,内存被分配,但只能在本地使用,而通过一个指向char指针的指针,分配的内存是";可见";即使在CCD_ 2函数内部也是如此。
这是我将堆中的内存分配给两个指针的代码:
#include <stdlib.h>
#include <stdio.h>
void AllocateMemoryToPtr(char* ptr)
{
if (!(ptr = malloc(32)))
exit(1);
}
void AllocateMemoryToDoublePtr(char** ptr)
{
if (!(*ptr = malloc(32)))
exit(1);
}
int __cdecl main(void)
{
char* Ptr = NULL;
char* DoublePtr = NULL;
printf("n");
printf("PtrttADDRESSttBEFOREtmalloct-> %pn", Ptr);
printf("PtrttVALUEttBEFOREtmalloct-> %sn", Ptr);
printf("n");
printf("DoublePtrtADDRESSttBEFOREtmalloct-> %pn", DoublePtr);
printf("DoublePtrtVALUEttBEFOREtmalloct-> %sn", DoublePtr);
printf("n");
AllocateMemoryToPtr(Ptr);
AllocateMemoryToDoublePtr(&DoublePtr);
printf("n");
printf("PtrttADDRESSttAFTERtmalloct-> %pn", Ptr);
printf("PtrttVALUEttAFTERtmalloct-> %sn", Ptr);
printf("n");
printf("DoublePtrtADDRESSttAFTERtmalloct-> %pn", DoublePtr);
printf("DoublePtrtVALUEttAFTERtmalloct-> %sn", DoublePtr);
printf("n");
return 0;
}
有人能澄清我关于如何使用指针在外部缓冲区中写入的想法吗?
C是按值传递的。也就是说,函数参数就像函数的局部变量,修改它们并不能修改原来的。要实现引用传递,您需要传递一个指向原始文件的指针。
void AllocateMemoryToPtr(char* ptr)
{
if (!(ptr = malloc(32)))
exit(1);
}
char*
是指向字符缓冲区的指针,允许您修改缓冲区,但不能修改原始指针指向的内容
所以这里有内存泄漏,函数返回时ptr
丢失。
void AllocateMemoryToDoublePtr(char** ptr)
{
if (!(*ptr = malloc(32)))
exit(1);
}
char**
是指针对指针,允许您修改原始指针(当然还有它指向的缓冲区(。
所以这就是你想要的。
另一个选项是返回分配块的地址,如下所示:
char * AllocateMemoryToPtr(int size)
{
if (!(char *ptr = malloc(size)))
exit(1);
return ptr;
}
在main
:中
int size = 32;
char *ptr = AllocateMemoryToPtr(size);