如何使用动态内存分配处理C中的矩阵?

时间:2016-07-25 10:49:18

标签: c matrix memory-management

我正在尝试运行模拟,其中我需要填充三个大小的矩阵" 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

2 个答案:

答案 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]来访问单元格。

顺便说一句,我相信有人会说&#34;不要使用演员&#34;但是使用演员会有好处 - 这是偏离主题的。