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

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)

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

  • 不错的方法!但是在某些非常特殊的情况下,此方法不合适。我的意思是当所需的对齐方式是!= sizeof(size_t)时。SSE数据就是这种情况,它使用128位对齐,并且对齐后的数据满足高速缓存行(64位)。size_t的填充破坏了通过_aligned_malloc获得的对齐方式。但是在所有其他情况下,如果默认对齐方式匹配sizeof(size_t)(通常为32位或64位),那是完美的。 (2认同)
  • 实际上,以上代码破坏了x86_64中默认malloc的16字节对齐方式。size_t填充会削减前8个字节。一个简单的解决方案应该是在分配时返回&ret [2]。在allocated_size()和my_free()函数中都使用索引-2。 (2认同)

MBy*_*ByD 1

在这种情况下你不能使用 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。