如何解决如何解决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 举报,一经查实,本站将立刻删除。