【问题标题】:how to fix dynamic memory allocation problem in c? [duplicate]如何解决c中的动态内存分配问题? [复制]
【发布时间】:2020-10-09 09:57:39
【问题描述】:

我正在尝试学习 c 并实现一些基本的内存分配。

当我使用 malloc、calloc 或 realloc 一个指向 int 的指针时,每次我最终都会得到相同的 8 字节内存块,即使我使用 20 字节的 malloc 初始化它也是如此。

如何解决?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{    
    int* ptr = (int*) malloc(sizeof(int) * 5);    
    printf("%d\n", sizeof(ptr) / sizeof(ptr[0]));    
    ptr = (int*) realloc(ptr, 10 * sizeof(int));    
    printf("%d\n", sizeof(ptr) / sizeof(ptr[0]));    
    return 0;
}

【问题讨论】:

标签: c memory-management dynamic-memory-allocation


【解决方案1】:

变量ptr 的类型为int *

所以表达式sizeof(ptr) 给出了您系统使用的类型为 int * 的对象的大小,它似乎等于8

所以这个表达式

sizeof(ptr) / sizeof(ptr[0])

等价于表达式

sizeof( int * ) / sizeof( int )

并且不依赖于动态分配的元素数量。

如果你动态分配一个数组,你应该将它的大小存储在某个地方(在一个变量中)。否则只有一个指针,如果该范围没有标记值,您将无法确定分配的内存范围的大小。

当你声明一个指向数组的指针时,有一种可能性,例如

int ( *ptr )[5] = malloc(sizeof(int) * 5);

在这种情况下,取消引用指针,您将获得分配数组的左值,并可以确定其大小

sizeof( *ptr ) / sizeof( **ptr );

请注意,您必须将转换说明符 zusize_t 类型的表达式一起使用。而不是例如这个调用

printf("%d\n", sizeof(ptr) / sizeof(ptr[0]));

你必须写

printf("%zu\n", sizeof(ptr) / sizeof(ptr[0]));
        ^^^ 

【讨论】:

  • 谢谢你的回答..有没有知道这个指针指向的内存量?
  • @SayedOmar 不,没有标准的方法可以做到这一点,你也不需要它。一些实现具有允许这样做的特殊功能,但您应该忘记它们。
  • @SayedOmar 在您的示例中,指针的类型为 int *。所以它指向一个 int 类型的标量对象。
猜你喜欢
  • 2020-10-25
  • 2021-03-13
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多