【问题标题】:C - Size of an array which is created by realloc [duplicate]C - 由 realloc 创建的数组的大小 [重复]
【发布时间】:2012-07-23 10:10:22
【问题描述】:

可能重复:
determine size of dynamically allocated memory in c

我的 c 代码中有一个 struct,但这个问题也适用于所有其他类型,所以我将使用 int 而不是我创建的 struct

int *a = realloc(NULL, 10*sizeof(int) );
printf("%d\n",sizeof(a)); //prints 4, needed to be 40

int b[10];
printf("%d\n",sizeof(b)); //prints 40

我的问题是:我在代码中使用realloc,但我不知道如何找到数组的总大小。最简单的方法是什么?谢谢。

【问题讨论】:

  • sizeof 不会在指针上做你想做的事。你不能简单地“忘记”你传递给realloc的东西。
  • @PaulR 编译时间? VLAs 呢?

标签: c sizeof realloc


【解决方案1】:

请记住,sizeof 在编译时进行评估(VLA 除外,但这不是您的情况)。想象一下,您将realloc 参数的大小作为用户的输入:编译器不可能知道实际分配的大小。所以它返回指针的大小。

【讨论】:

  • “在编译时评估”——显然不适用于 C99,其中 sizeof 在运行时与 VLA 一起工作(我今天学到了一些新东西!)。
  • 我明白了。那么有没有什么函数可以动态计算它的大小,或者我应该把它的大小保存在一个变量中?
  • 您需要自己跟踪分配大小 - 事后没有可移植的方式来获取此信息。
  • @Paul R:是的,C99 的 VLA 是一个例外:但这是一个非常奇怪的主题,有时是一件坏事(C11 有可选的,所以我根本不使用它们......几乎折旧......)。
  • @ibrahim :没有可移植的方法来获得这个大小。将您的尺寸存储到数据结构中,这是更好的方法!
【解决方案2】:

简而言之,您需要将其存储在代码中,并传递给您的各种函数。由于您将该信息传递给realloc,它已经可用。

还要记住 sizeof 对指针不起作用,它只会返回指针的大小,而不是指针指向的内存大小。

【讨论】:

    【解决方案3】:

    来自http://en.wikipedia.org/wiki/Sizeof

    In the programming languages C and C++, the unary operator sizeof
    is used to calculate the size of any datatype, measured in the
    number of bytes required to represent the type.
    

    这意味着这个

    sizeof( int* )
    

    返回架构上指针的大小。如果你想知道你的数组的大小,你必须这样做:

    sizeof( your_type ) * array_size
    

    【讨论】:

      【解决方案4】:

      sizeof(a) 返回 指针 的大小而不是它所指向的大小。如果您使用mallocrealloc 分配内存,您必须自己跟踪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 2012-10-01
        • 2017-08-24
        相关资源
        最近更新 更多