【问题标题】:Dynamic memory allocation within dynamic allocated memory on C++C++ 上动态分配内存中的动态内存分配
【发布时间】:2013-06-25 22:52:24
【问题描述】:

我想问一个关于 C++ 中动态内存分配的问题。 我知道我要提出的问题的性质很容易使用简单的 C++ 技术来解决,但是对于这个特定的练习,我必须使用更像 C 的方法。 让我举个例子:

我有以下结构:

typedef struct A{
    B *b;
    int a;
}

typedef struct B{
    C *c;
    int x;
}

typedef struct C{
    int y;
}

让我们假设这个主要:

int main(){
    A test;
    test.a = 1;

    test.b = (B*)calloc(2,sizeof(B));

    test.b[0].c = (C*)calloc(2,sizeof(C)); 
    test.b[0].x = 2; 
    test.b[0].c[0].y = 3;
    test.b[0].c[1].y = 4;

    test.b[1].c = (C*)calloc(2,sizeof(C));
    test.b[1].x = 5;
    test.b[1].c[0].y = 6;
    test.b[1].c[1].y = 7;
}

所以我的问题如下: 怎么了? 分配给test.b[i].c 的内存块是否有可能与之前分配给test.b 的内存块重叠? 如果有可能发生这种情况,我该如何防止它发生? 如果不可能,您能否准确解释calloc() 是如何分配内存的?我真的很感激一个数字示例。

【问题讨论】:

  • 您还可以检查从 calloc 返回的不为 NULL 的指针以确定。更安全。

标签: c++ arrays memory dynamic allocation


【解决方案1】:

为 test.b[i].c 分配的内存块是否有可能与之前为 test.b 分配的内存块重叠?

没有。

如果可能发生这种情况,我该如何防止它发生?

这不可能发生,所以不要担心。

如果不可能,你能解释一下 calloc() 是如何分配内存的吗?

每次调用calloc 时,它都会返回一个指向零初始化内存块的指针,该内存块大到足以容纳请求的对象数量,如果失败,则返回NULL。只要您没有收到NULL 的回复,您就没有什么可担心的了。

我不确定您所说的“数字示例”是什么意思。

【讨论】:

  • 感谢您的快速回答。这确实减轻了我的压力,但我仍然必须找出我的代码有什么问题。我知道 calloc 在更高级别上做了什么(意味着指针部分)。数字示例是指涉及某些内存块分配的示例。假设当我第一次使用 calloc 时,它会分配内存块 0x0000 到 0x0010 等。它真的可以帮助我理解 calloc 在幕后是如何工作的。如果您也能提供,我将不胜感激。
  • 这非常依赖于系统——如果你想看的话,网上有很多开源 C 库实现。
猜你喜欢
  • 2015-12-07
  • 2015-06-27
  • 2021-02-28
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多