c - 如何访问双指针样式矩阵中的元素

标签 c pointers multidimensional-array matrix

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]);
   }
}

我正在尝试使用上面的方法创建一个二维 double 组(创建一个指针数组,然后每个指针获取一个 double 组)。然而,一旦我尝试打印第一个元素矩阵[0][0],我就会遇到段错误。我看过其他一些帖子,它们几乎做同样的事情,只是我无法让我的帖子工作。

最佳答案

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

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

在 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]);
  }
}

关于c - 如何访问双指针样式矩阵中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16412008/

相关文章:

c - 生产者消费者问题

c - 它在最后打印了一个额外的零,我不确定为什么

c - 使用类型定义的数据类型取消引用通用指针

PHP - 将 2d 数组转换为按特定值分组的 3d 数组的最快方法

Python:从键:值对字符串创建嵌套字典

c - 管道 C 上的多维数组

c - 当尝试实现字符串数组时我做错了什么?

java - 使用掩码读取 int 的未知方式

c++ - 指针的 STL vector 上的等于运算符

C++动态数组在分配时导致段错误