【问题标题】:Struct Pointer Not Providing the Correct Size in sizeof() method结构指针在 sizeof() 方法中未提供正确的大小
【发布时间】:2011-12-14 18:00:19
【问题描述】:

我在使用 malloc 或 realloc 分配内存后获取结构指针的大小时遇到​​问题。我已经通过在单独的计数器中跟踪内存来解决这个问题,但我想知道这是否是一个错误,或者是否有办法正确查询结构指针的大小。

示例代码演示了无论我为结构指针分配多少内存,在使用 sizeof() 方法查询时它总是返回 4。

typedef struct {
    int modelID;
    int bufferPosition;
    int bufferSize;
} Model;

Model *models = malloc(10000 * sizeof(Model));

NSLog(@"sizeof(models) = %lu", sizeof(models)); //this prints: sizeof(models) = 4

【问题讨论】:

  • 请标记此目标 C 而不是 C。

标签: objective-c struct malloc


【解决方案1】:

4 是正确答案,因为“模型”是一个指针,而指针是 4 个字节。您将无法以这种方式找到数组的长度。有什么理由不使用 NSArray?

【讨论】:

    【解决方案2】:

    sizeof(myvar) 将返回指针的大小。在 32 位环境中,它等于 4(字节)。 你为什么不改用sizeof (Model)

    【讨论】:

      【解决方案3】:

      4 是正确答案。 指针指向可以包含任何内容的内存位置。当您查询指针的大小时,它会给出保存指针的内存位置的大小,在您的情况下为 4。

      例如

      int *a = pointing to some large number;
      
      int *b = pointing to a single digit number;
      

      在上述情况下,a 和 b 都具有相同的大小,而与它们指向的位置无关。

      欲了解更多信息,请查看此帖子size of a pointer

      【讨论】:

        【解决方案4】:

        如果我理解正确,您希望获得分配缓冲区的大小。

        sizeof 如果是错误的方式,因为它是在编译时评估的。缓冲区的大小是一个运行时概念。

        您需要一种方法来查询您的 C 库以返回指向缓冲区的指针的分配大小。

        某些系统有办法获取此类信息,例如 Mac OS 上的malloc_size

        【讨论】:

        • 这正是我想要的。为了让它在 iOS 上工作,我必须导入 malloc/malloc.h,之后它现在似乎都可以工作了。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2021-04-03
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2021-03-28
        相关资源
        最近更新 更多