Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我无法使用c中的realloc将内存重新分配到整数_C_Realloc - Fatal编程技术网

我无法使用c中的realloc将内存重新分配到整数

我无法使用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

我正在尝试使用以下代码将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 *)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
,not
int
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
,not
int
4)通过查看它们的返回值来检查
malloc
realloc
是否成功。@SouravGhosh:如果我要猜测,那么我会说任何支持VLA的编译器都必须用可编译表达式
sizeof(*arr)*n
替换不可编译表达式
sizeof(arr[n])
,可以在运行时对其进行评估。@StoryTeller:我想我应该开始实现编译器:)我会使用“编译”而不是“翻译”,我会在运行时添加
malloc
/以强调和区分这两种情况。虽然OP的技术误解是关于
sizeof
的用法,但我认为他或她所缺少的真正见解是编译时和运行时之间的差异。@barakmanos-Translation是标准使用的术语,我试图坚持这一点。另一点确实很好,谢谢。我会使用“编译”而不是“翻译”,我会在运行时添加
malloc
/
realloc
“做他们的事”,以强调和区分这两种情况。虽然OP的技术误解是关于
sizeof
的用法,但我认为他或她所缺少的真正见解是编译时和运行时之间的差异。@barakmanos-Translation是标准使用的术语,我试图坚持这一点。