我无法使用c中的realloc将内存重新分配到整数
我正在尝试使用以下代码将20个字节重新分配给已占用10个字节的整数:我无法使用c中的realloc将内存重新分配到整数,c,realloc,C,Realloc,我正在尝试使用以下代码将20个字节重新分配给已占用10个字节的整数: #include <stdio.h> #include <stdlib.h> void main() { int *ptr; ptr=(int *)malloc(10*sizeof(int)); printf("size before re-allocation : %d bytes",sizeof(ptr)); ptr=(int *)r
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *ptr;
ptr=(int *)malloc(10*sizeof(int));
printf("size before re-allocation : %d bytes",sizeof(ptr));
ptr=(int *)realloc(ptr,20*sizeof(int));
printf("size after re-allocation : %d bytes",sizeof(ptr));
free(ptr);
}
#包括
#包括
void main()
{
int*ptr;
ptr=(int*)malloc(10*sizeof(int));
printf(“重新分配前的大小:%d字节”,sizeof(ptr));
ptr=(int*)realloc(ptr,20*sizeof(int));
printf(“重新分配后的大小:%d字节”,sizeof(ptr));
免费(ptr);
}
但是输出在realloc之前和之后显示了8个字节。
我做错了什么?sizeof(ptr)
确定单个整数指针的大小sizeof
是一个在转换过程中静态应用的运算符(可变长度数组除外,但这里不是这种情况)。ptr
的静态类型是int*
,因此可以打印sizeof(int*)
sizeof(ptr)
永远不会是sizeof(int[10])
,因为数组不是指针,尽管许多教程错误地教导它们是指针
然而,好消息是,如果malloc
/realloc
返回除NULL以外的任何地址,那么确实有ptr
指向内存的点可以包含10/20个整数。因此,您只需要跟踪分配的大小
但是,请注意,malloc
及其近亲在程序运行期间进行内存分配,这与sizeof
相反,后者(在大多数情况下,VLA的)在程序运行之前返回一个结果。sizeof(ptr)
确定单个整数指针的大小sizeof
是一个在转换过程中静态应用的运算符(可变长度数组除外,但这里不是这种情况)。ptr
的静态类型是int*
,因此可以打印sizeof(int*)
sizeof(ptr)
永远不会是sizeof(int[10])
,因为数组不是指针,尽管许多教程错误地教导它们是指针
然而,好消息是,如果malloc
/realloc
返回除NULL以外的任何地址,那么确实有ptr
指向内存的点可以包含10/20个整数。因此,您只需要跟踪分配的大小
但是,请注意,
malloc
及其近亲在程序运行期间进行内存分配,这与sizeof
相反(在大多数情况下,VLA同样)会在程序运行之前返回一个结果方式。至少不能通过编程方式检查为C语言中的某些内容分配了多少内存,没有任何标准函数可以做到这一点。您(程序员)必须跟踪它,并且必须确保所有分配的内存都已使用free
sizeof
是一个编译时运算符正确释放。您不能使用它来检索运行时信息(在您的示例中,它是由malloc
和realloc
返回的已分配内存块的大小)。此外,1)void main()
→ int main(void)
2)从malloc
和realloc
3)删除强制类型转换使用%zu
而不是%d
,因为sizeof
返回size\u t
,notint
4)通过查看它们的返回值来检查malloc
和realloc
是否成功。@SouravGhosh:如果我要猜测,那么我会说任何支持VLA的编译器都必须用可编译表达式sizeof(*arr)*n
替换不可编译表达式sizeof(arr[n])
,可以在运行时对其进行计算。@StoryTeller:我想我应该开始实现编译器:)您无法通过编程方式检查为C语言中的某些内容分配了多少内存,至少没有任何标准函数可以这样做。您(程序员)必须跟踪它,并且必须确保所有分配的内存都已使用free
sizeof
是一个编译时运算符正确释放。您不能使用它来检索运行时信息(在您的示例中,它是由malloc
和realloc
返回的已分配内存块的大小)。此外,1)void main()
→ int main(void)
2)从malloc
和realloc
3)删除强制类型转换使用%zu
而不是%d
,因为sizeof
返回size\u t
,notint
4)通过查看它们的返回值来检查malloc
和realloc
是否成功。@SouravGhosh:如果我要猜测,那么我会说任何支持VLA的编译器都必须用可编译表达式sizeof(*arr)*n
替换不可编译表达式sizeof(arr[n])
,可以在运行时对其进行评估。@StoryTeller:我想我应该开始实现编译器:)我会使用“编译”而不是“翻译”,我会在运行时添加malloc
/sizeof
的用法,但我认为他或她所缺少的真正见解是编译时和运行时之间的差异。@barakmanos-Translation是标准使用的术语,我试图坚持这一点。另一点确实很好,谢谢。我会使用“编译”而不是“翻译”,我会在运行时添加malloc
/realloc
“做他们的事”,以强调和区分这两种情况。虽然OP的技术误解是关于sizeof
的用法,但我认为他或她所缺少的真正见解是编译时和运行时之间的差异。@barakmanos-Translation是标准使用的术语,我试图坚持这一点。