0
double **matrix = NULL;
matrix = (double **)malloc(sizeof(double *) * N);   // N is the size of the square matrix

for(int i=0; i<N; i++)
{
   matrix[i] = (double *)malloc(sizeof(double)*N);
}

// Works good up to the next part
for(int i=0; i<N; i++)
{
   for(int j=0; j<N; j++)
   {
      printf("Value: %f", matrix[i][j]);
   }
}

我正在尝试使用上面的方法创建一个二维双精度数组(创建一个指针数组,然后每个指针获取一个双精度数组)。但是,一旦我尝试打印第一个元素 matrix[0][0],就会出现段错误。我看过其他一些几乎做同样事情的帖子,除了我不能让我的工作。

4

2 回答 2

3

在语法方面,您的代码没有任何问题。要么您没有显示整个代码,要么(不太可能)程序内存不足,而您没有检查 malloc 的结果来了解这一点。

程序设计方面,您不应该使用分段指针指向指针语法;它在整个堆中创建 N 个数组,而不是在相邻的内存单元中分配一个真正的 2D 数组。堆碎片对程序性能不利,并可能导致各种其他问题(取决于系统)。

在 C 中强制转换 malloc 的结果是没有意义的。在旧的 C 编译器上,它甚至是有害的。

在打印它们之前,您不会为数组的项目提供任何值。要将它们全部设置为零,请使用 memset 或将 malloc 替换为 calloc。

您应该解决上述问题并将您的代码重写为:

#include <stdlib.h>
#include <stdio.h>

double (*matrix)[N];  // an array pointer
matrix = calloc(1, sizeof(double[N][N])); // pointing at one true 2D array

if(matrix == NULL)
{
  // handle error
}


for(int i=0; i<N; i++)
{
  for(int j=0; j<N; j++)
  {
    printf("Value: %f", matrix[i][j]);
  }
}
于 2013-05-07T06:28:19.753 回答
-3

嗨,我有这个 c++ 文件,它与 g++ 编译器一起运行良好。

#include <cstdio>
#include <cstdlib>

using namespace std;

int main(){
    int N = 10;
    double **matrix = NULL;
    matrix = (double **)malloc(sizeof(double *) * N);   // N is the size of the square matrix

    for(int i=0; i<N; i++)
    {
        matrix[i] = (double *)malloc(sizeof(double)*N);
    }

    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            printf("Value: %f", matrix[i][j]);
        }
    }
}
于 2013-05-07T05:56:28.990 回答