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]);
}
}
我正在尝试使用上面的方法创建一个二维的双精度数组(创建一个指针数组,然后每个指针获得一个双精度数组)。但是,一旦我尝试打印第一个元素矩阵[0] [0],我就会得到一个seg错误。我看到其他一些帖子几乎都做同样的事情,除了我不能让我的工作。
答案 0 :(得分: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]);
}
}
答案 1 :(得分:-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]);
}
}
}