【问题标题】:Access violation writing location 0xCCCCCCCC creating 2d array访问冲突写入位置 0xCCCCCCCC 创建二维数组
【发布时间】:2020-02-11 10:03:23
【问题描述】:

我正在尝试制作一个动态二维数组。

这是我的代码:

bool b_alloc_table_2_dim(int ***piTable, int iSizeX, int iSizeY)
{
    *piTable = new int*[iSizeX];
    for (int ii = 0; ii < iSizeX; ii++)
        *piTable[ii] = new int[iSizeY]; // here i get the exception
    return true;
}

int main()
{
    int **x ;
    b_alloc_table_2_dim( &x, 3, 5);

    return 0;
}

我找不到代码有什么问题。调用我的函数后,x 应该指向二维数组。

【问题讨论】:

标签: c++ multidimensional-array dynamic-memory-allocation access-violation


【解决方案1】:

[] 运算符优先于 *cppreference

所以行

*piTable[ii] = new int[iSizeY];

等价于

*(piTable[ii]) = new int[iSizeY];

你想写的是:

(*piTable)[ii] = new int[iSizeY];

【讨论】:

  • 非常感谢。解决了它:)
  • @JakubWojcieszonek 不要忘记也 delete 动态分配的内存以避免内存泄漏并遵循最佳编码实践。
【解决方案2】:

使用实际容器

使用实际容器可以避免您遇到的许多类型的问题。

代替

int**

对于二维数组(矩阵),更合适的数据结构可能是

std::array< std::array<int, cols>, rows> 

如果大小在编译时已知。


如果没有,最好只使用单个向量 ala。

auto my_array2d = std::vector<int>(rows*cols);//array now has 'rows*cols' elements of '0'

并自己处理索引。

最好的办法当然是使用像 这样的库

【讨论】:

  • 谢谢,不过我应该按照任务来做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多