C 中使用 malloc 和 realloc 进行动态内存分配 [重复]

问题描述 投票:0回答:2

为什么 ptr 具有相同的大小,即使我期望 ptr 的大小为 5*size(int)/4 = 20 但我得到当前大小是 8 并且新大小是 8,请任何解释?

 int *ptr;

 ptr = (int*)malloc(5 * sizeof(int));
 printf("current size is %ld\n", sizeof(ptr));

 for (int i = 0; i < 5 ; i++)
 {
     ptr[i] = i + 1;
 }
    
 for (int i = 0; i < 5 ; i++)
 {
     printf("%d\n",*(ptr + i));
 }
  
 ptr = (int*)realloc(ptr, 10 * sizeof(int));

 printf("new size is %ld\n", sizeof(ptr));
   
 for (int i = 0; i < 5 ; i++)
 {
     printf("%d\n", *(ptr + i));
 }
c
2个回答
1
投票

64 位 PC 上的任何指针“可能”都是 64 位,即 8 个字节。您正在打印指针本身的大小,而不是它指向的整个内存块。 请参阅@kaylum 在评论中指出的文章。

如何确定分配的C缓冲区的大小?

一些附加说明:

在 C 中,您不应投射
    malloc
  • calloc
    realloc
    的结果。
    我应该转换 malloc 的结果(在 C 中)吗?
  • malloc
  • calloc
    realloc
    功能
    可能
    失败。您应该在继续之前检查它们是否成功,以避免出现错误。 如果
  • realloc
  • 失败并且您已分配回同一指针,您将不再有指向原始内存的指针,因此无法在处理错误时正确管理该内存。相反,分配给不同的(临时)指针,并且仅当您确信
    realloc
    成功时才分配回原始指针。例如
    
    
  • #include <memory> int main(void) { size_t sz = 2; int *mem = malloc(sizeof(int) * sz); if (!mem) { fprintf(stderr, "Memory allocation for %d ints failed.\n", sz); return 1; } sz *= 2; int *tmp = realloc(mem, sizeof(int) * sz); if (!tmp) { fprintf(stderr, "Memory reallocation for %d ints failed.\n", sz); free(mem); return 1; } mem = tmp; return 0; }


0
投票

comp.lang.c常见问题列表·问题7.27

- 问。

那么我可以查询

malloc包来了解分配的块有多大吗?


A. 

不幸的是,没有标准或便携的方法。 (某些编译器提供非标准扩展。)

如果您需要知道,则必须自己跟踪它。(另请参阅问题 7.28。)

© www.soinside.com 2019 - 2024. All rights reserved.