【问题标题】:Malloc of pointer to an array- C++指向数组的指针的 Malloc-C++
【发布时间】:2018-12-10 20:20:10
【问题描述】:

我有一个函数,它获取一个指向数组的指针作为参数, 例如int** segs。 我需要为数组分配(在函数体中)内存,例如大小为 100。 我的尝试是:

*segs=(int*)(malloc(100));

到目前为止一切顺利。 我在*segs[0] 中输入了一个值,但一切都很好。 但是...当我尝试访问 *segs[1] 时,我从 valgrind 收到“大小为 4 的无效写入”错误,这会导致 seg-fault。 我不知道为什么会这样。 我试图联系*segs[2],但后来我得到了更奇怪的东西-

大小为 8 的未初始化值错误。

【问题讨论】:

  • 请尝试创建minimal reproducible example 向我们展示您的尝试。
  • 你真的是指 C++ 吗?因为这听起来像 C 代码。用 C++ 编写这样的代码是零理由。
  • 我将值放入 *segs[0] - 请注意operator precedence。消除歧义,例如 (*segs)[0] = ... 或使用本地 var 并在其他所有操作完成后保存到目标 ptr-to-ptr。
  • *segs 有什么东西吗?

标签: c++ arrays pointers malloc


【解决方案1】:

由于operator precedence*segs[N]被视为*(segs[N]),当N等于0时可以。然而,当你使用索引 1 做同样的事情时,事情就会中断,因为没有为 segs[1] 分配任何东西

对于非零的任何索引,您需要使用(*segs)[N]

在函数中使用临时指针会更容易。

int* ptr = (int*)(malloc(100));
*segs = ptr;

// and then

ptr[0] = ...;  // Good
ptr[1] = ...;  // Good

...


ptr[99] = ...; // Still good

升级到C++方式

  1. 通过引用传递指针。

    void foo(int*& segs) { ... }
    
  2. 使用new 而不是malloc 来分配内存。

    segs = new int[100];
    
  3. 更好的是,使用 std::vector 代替原始数组。

    void foo(std::vector<int>& segs) { ... }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多