RoC*_*eRs 4 c size malloc pointers memory-management
在这种情况下,我遇到了一些问题,请您提出您的想法。
main()
{
char *p=NULL;
p=(char *)malloc(2000 * sizeof(char));
printf("size of p = %d\n",sizeof (p));
}
Run Code Online (Sandbox Code Playgroud)
在此程序中,它打印4那个(char *)值,但是我需要为此分配多少字节。
小智 5
您还可以为malloc实现包装器,并在malloc返回的指针之前自由添加标签(如分配的大小和其他元信息)。实际上,这是c ++编译器使用对虚拟类的引用标记对象的方法。这是一个工作示例:
#include <stdlib.h>
#include <stdio.h>
void * my_malloc(size_t s)
{
size_t * ret = malloc(sizeof(size_t) + s);
*ret = s;
return &ret[1];
}
void my_free(void * ptr)
{
free( (size_t*)ptr - 1);
}
size_t allocated_size(void * ptr)
{
return ((size_t*)ptr)[-1];
}
int main(int argc, const char ** argv) {
int * array = my_malloc(sizeof(int) * 3);
printf("%u\n", allocated_size(array));
my_free(array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与具有大小和指针的结构相比,此方法的优势
struct pointer
{
size_t size;
void *p;
};
Run Code Online (Sandbox Code Playgroud)
就是您只需要替换malloc和free调用即可。所有其他指针操作都不需要重构。
在这种情况下你不能使用 sizeof,因为它p是一个指针,而不是一个数组,但既然你分配了它,你已经知道:
main()
{
size_t arr_size = 2000;
char *p=NULL;
p=malloc(arr_size * sizeof(char));
printf("size of p = %d\n",arr_size);
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 如果 malloc 无法分配您想要的大小,它不会为您提供指向较小缓冲区的指针,但会返回 NULL。