【问题标题】:Limitations of malloc / realloc to char **?malloc / realloc 对 char ** 的限制?
【发布时间】:2015-10-16 06:50:31
【问题描述】:

假设我有一个 char** "bob",我将其 malloc 形式为

char **bob = malloc(10 * sizeof(bob[0]));

对于我存储在 bob 下的每个元素,我会以

的形式分配一定数量的空间
bob[num] = malloc(10);

我的问题是,你只能在 bob 下 malloc 元素达到你 malloc char** 本身的数量吗?

即如果 bob[num] = malloc(10); 重复 5 次,我们总共分配了 50 个字节 - 因为这超过了原始的 10 * sizeof(bob[0])(其中 malloc 40),这会导致程序搞砸吗?

或者你 malloc 到 char** 下的元素的内存量不受分配给 char** 本身的内存限制?

【问题讨论】:

    标签: c arrays pointers memory-management


    【解决方案1】:

    您正在创建一个基于指针的查找表。不要将此与 2D 数组混淆。

    第一个 malloc 分配一个指针数组,即实际表,它与指向的数据没有任何关系。内存布局会是这样的:

    bob[0] -> some segment of memory
    bob[1] -> some other segment of memory
    ...
    

    不同段的大小也可以是完全独立的,彼此没有关系。

    【讨论】:

      【解决方案2】:

      或者你 malloc 到 char** 下的元素的内存量不受分配给 char** 本身的内存限制?

      是的,就是这样。当您为 char** 分配内存时,您正在为 10 个 char* 腾出空间。然后,当您分配这些char* 时,它们最终指向完全独立的新内存块,与它们本身存储的块无关。

      【讨论】:

      • 我已经为我的 char** 分配了 40,但当我尝试将第 13 个元素插入其中时程序崩溃。当我分配 44 时,它会在插入第 21 个元素后崩溃。这很混乱,我以为 4 个字节 = 1 个指针?
      • @RobertBenedict 指针的大小取决于平台。您的内存使用可能存在错误,您应该发布一个关于崩溃问题的新问题。
      • @RobertBenedict 如果您为 10 个指针分配空间并写入第 13 个“元素”,那么您正在调用 未定义的行为。这并不意味着它会在 11 或 20 甚至 385 崩溃。它可以做任何事情,因为它是未定义的
      • @RobertBenedict 永远不要假设类型的大小:始终使用 sizeof 运算符。我怀疑你会发现指针在你的系统上是 8 个字节(因为它们在我的系统上)。
      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 2017-02-25
      • 1970-01-01
      • 2014-04-27
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      相关资源
      最近更新 更多