动态分配的数组 - 无法访问的元素

Cat*_*hal 1 c pointers multidimensional-array

我正在编写一个矩阵乘法程序,为了节省代码空间,我创建了一个函数make,该函数接受一个指向双指针的指针并动态分配给定大小的二维数组.数组ab初始化为[-2,2]中的随机值.但是,当我尝试在gcc上运行代码时,我遇到了一个seg错误.

我通过gdb运行代码,当我尝试设置b[0][0]为随机数时出现错误.当我尝试b[0][0]在gdb中打印时,我收到错误:

无法访问地址0xbfebfdc3f5d77f80的内存

但是,我实际上能够b[0][0]在此之前访问.我可以在分配它之后立即打印数组而不会出错.出于某种原因,它b似乎总是导致问题的数组.

我觉得这是一个指针问题,但我看不到哪里.我不是一个没有经验的程序员,但我花了2天的时间试图找出为什么这个错误不断出现.任何人都能解释一下吗?

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


void make(double ***a, int m, int n)
{
  int i;
  double *tmp;


  (*a) = (double **) malloc(m*sizeof(double *));
  tmp = (double *) calloc(m*n,sizeof(double));

  if(tmp == NULL)
  {
    printf("Error with malloc.\n");
    exit(EXIT_FAILURE);
  }

  for(i=0;i<m;i++)
    (*a)[i] = &tmp[i*n];


  free(tmp);

  if(a == NULL)
  {
    fprintf(stderr, "Error with the matrix, dimensions: %d, %d. \n", m, n);
    exit(EXIT_FAILURE);
  }
}


int main()
{
  int i, j;
  int l, m, n;
  double **a, **b, **c;

  l = m = n = 8;

  srand48(time(NULL));

  make(&a, l, m);
  make(&b, m, n);
  make(&c, l, n);

  for(i=0; i<l; i++)
    for(j=0; j<m; j++)
      a[i][j] = (drand48()*4.0) - 2.0;

  for(i=0; i<m; i++)
    for(j=0; j<n; j++)
      b[i][j] = (drand48()*4.0) - 2.0;

  free(a);
  free(b);
  free(c);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 5

一个问题是调用free(tmp)make.那是为数组分配的内存.如果您打算继续使用它,则不应释放它.