我正在尝试运行模拟,其中我需要填充三个大小的矩阵" 2 x次迭代",这是(iterations =)10 ^ 8列和2行。我也使用大小为10 ^ 8的矢量t。使用动态内存分配我写了以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define T 10000
#define dt 0.0001
#define iterations (T/dt)
/*(more code)*/
int main(){
int i, j;
double *t;
double (*x)[2], (*y)[2], (*c)[2];
t=(double *) malloc((iterations-1)*sizeof(double));
x=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
y=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
c=(double (*)[2]) malloc((2*(iterations))*sizeof(double));
for(i=0; i=1; i++){
x[i][0]=50+500*i;
y[i][0]=300;
c[i][0]=15;
}
for(j=0; j<=iterations-2; j++){
t[j+1]=t[j]+dt;
/*(more code)*/
printf("%G %G %G %G %G %G\n",x[0][j+1],x[1][j+1],y[0][j+1],y[1][j+1],c[0][j+1],c[1][j+1]);
}
return 0;
}
是否正确写入了动态内存分配?我的意思是,我真的有一个大小的矢量t&#34;迭代&#34;和三个矩阵大小&#34; 2 x迭代&#34;?
而且,如果我想填充矩阵的每个分量,例如我想在矩阵x的位置(1,4)中得到50,那么我是否必须写x [1] [4] = 50 ? (就像在第一个&#34; for&#34;。)
问题是执行程序我得到一个错误:分段错误。然后,使用调试器,我得到以下内容:
编程接收信号SIGSEGV,分段故障。
X [0] [0] = 50
答案 0 :(得分:1)
我的意思是,我真的有一个大小为“迭代”的矢量t
t=(double *) malloc((iterations-1)*sizeof(double));
^^^
由于你减去一个,答案是否定的。
....以及大小为“2 x iterations”的三个矩阵?
嗯 - 是的,你有三个大小为“2 x迭代”的矩阵。但是,你所拥有的相当于:
double m[iterations][2];
所以你有“迭代”行和2列。
请记住始终检查“内存不足”,即
p = malloc(....);
if (p == NULL)
{
printf("out of mem\n");
return -1;
}
所以你可以像访问它一样访问它:
m[0][0]
m[0][1]
m[1][0]
m[1][1]
m[2][0]
m[2][1]
m[3][0]
......
答案 1 :(得分:1)
分配矩阵的一般方法:
double **mat_init(int n_rows, int n_cols)
{
double **m;
int i;
m = (double**)malloc(n_rows * sizeof(double*));
for (i = 0; i < n_rows; ++i)
m[i] = (double*)calloc(n_cols, sizeof(double));
return m;
}
void mat_destroy(int n_rows, double **m)
{
int i;
for (i = 0; i < n_rows; ++i) free(m[i]);
free(m);
}
你也可以这样做:
double **mat_init2(int n_rows, int n_cols)
{
double **m;
int i;
m = (double**)malloc(n_rows * sizeof(double*));
m[0] = (double*)calloc(n_rows * n_cols, sizeof(double));
for (i = 1; i < n_rows; ++i)
m[i] = m[i-1] + n_cols;
return m;
}
void mat_destroy2(double **m)
{
free(m[0]); free(m);
}
对于上述两种方法,您都可以使用matrix[row][col]
来访问单元格。有时,您可能更喜欢分配单个阵列并使用matrix[row*n_cols+col]
来访问单元格。