【问题标题】:Error during allocating memory for double values为双精度值分配内存时出错
【发布时间】:2016-04-23 14:27:34
【问题描述】:

我的代码中出现了问题,我为双精度值分配了一个二维数组。 所以首先我使用的代码:

double** matrix;
double ncolumn=2;
double nrow;

for (size_t i=0; i<nSlices; ++i) {
    const std::vector<LineSegment> &lss = slicesWithLineSegments[i];
    //I use 
    nrow = lss.size();//Returns the numbers ob Row;
    matrix = malloc(nrow*sizeof(double*));

    for (size_t j=0; j<nrow; ++j) 
    {
        matrix[j] = malloc(ncolumn * sizeof(double));
    }
}

由于我有许多段,并且每个段的行数不同,因此我必须为每个段编辑数组。这就是为什么我使用带有 nSlices 的 for 循环。

但是在 malloc 命令的两行中,我从 Visual Studio 收到错误消息。这是错误消息:

错误 C2440:“=”:无法从“void *”转换为“double *”
错误 C2440:“=”:无法从“void *”转换为“double *”
IntelliSense:“void *”类型的值不能分配给“double **”类型的实体
IntelliSense:“void *”类型的值不能分配给“double *”类型的实体

我也尝试使用 calloc,但我也收到此错误消息。我也看了一下谷歌,只是按照我的方式找到了代码。但是错误仍然存​​在。

【问题讨论】:

  • 你必须在 c++ 中转换 (double *) malloc( ... ) 或使用 ̀new double*`
  • 我也这么写:matrix = (double*) malloc(nrowsizeof(double));和矩阵[j] = (double *) malloc(ncolumn * sizeof(double));
  • 拜托!这是 C++。使用new[]delete[],或者更好的是vector&lt;double&gt;
  • @Roddy 我现在正在使用 new[] 命令,现在我可以分配内存了。要释放内存,我必须使用数组的反向路径。那么首先在 for 循环中使用 delete[] 命令,而不是在数组中使用 delete[]?
  • @user3794592 是的。 (但std::vector会省去你删除的麻烦)

标签: c++ arrays malloc


【解决方案1】:

malloc 返回一个 (void*) 指针,你应该将返回值强制转换为 (double**) 和 (double*)

matrix = (double**)malloc(nrow*sizeof(double*));

matrix[j] = (double*)malloc(ncolumn * sizeof(double));

【讨论】:

    【解决方案2】:

    错误消息清楚地告诉您发生了什么:malloc 返回void*,既不是double**,也不是double*。要么转换结果:

    matrix = (double**)malloc(nrow*sizeof(double*));
    // ...
    matrix[j] = (double*)malloc(ncolumn * sizeof(double));
    

    或重构为std::vector&lt;double&gt;(注意:如果需要密集矩阵,则不是std::vector&lt;std::vector&lt;double&gt;&gt;,请参阅 this answer),这样更简单、更安全。

    【讨论】:

      【解决方案3】:

      malloc 返回 void *.在 malloc 之前尝试 (double *) 或使用 operator new

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-07
        • 2017-05-08
        • 1970-01-01
        • 2016-02-24
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多