c - 我怎么知道c中指针变量的分配内存大小

标签 c pointers size memory-management malloc

<分区>

在这种情况下我遇到了一些问题,你能提出你的想法吗?

main()
{
char *p=NULL;
p=(char *)malloc(2000 * sizeof(char));
printf("size of p = %d\n",sizeof (p));
}

在这个程序中,它打印了 4 个 (char *) 值,但我需要分配多少字节 那个。

最佳答案

您还可以为 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;
}

此方法相对于具有大小和指针的结构的优势

 struct pointer
 {
   size_t size;
   void *p;
 }; 

是您只需要替换 mallocfree 调用。所有其他指针操作都不需要重构。

关于c - 我怎么知道c中指针变量的分配内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7202069/

相关文章:

c++ - 顺便说一下获取的区别,scanf ('%s'),getline

C 程序未终止

java - 为什么即使在设置 JPanel 的大小后,我的框布局也会更改大小

c# - 如何在 C# 中查找类的大小

math - 何时使用不同的整数类型?

c - C语言中的隐式声明

c - 从 C 中的字符串填充二维整数数组

c - 为什么我们不在 scanf 中使用 '&' 作为 char 数组

c++ - 当两个类共享同一个堆对象时,如何避免删除指针两次?

C++ 传递指针引用