微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决c中的动态内存分配问题?

如何解决如何解决c中的动态内存分配问题?

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

当我使用malloc,calloc或重新分配一个指向int的指针时,即使每次使用20字节的malloc对其进行初始化时,每次我都得到相同的8字节内存块。

如何解决这个问题?

#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;
}

解决方法

变量ptr的类型为int *

因此,表达式sizeof(ptr)给出了系统中使用的i nt *类型的对象的大小,似乎等于8

因此这个表达式

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

等同于表达式

sizeof( int * ) / sizeof( int )

,并且不依赖于动态分配了多少个元素。

如果要动态分配数组,则应将其大小存储在某个位置(在变量中)。否则,只有一个指针,如果扩展区没有哨兵值,则无法确定分配的存储扩展区的大小。

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

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

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

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

请注意,必须对类型为zu的表达式使用转换说明符size_t。而不是例如此呼叫

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

你必须写

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。