1

我正在编写一个矩阵乘法程序,为了节省代码空间,我创建了一个函数,该函数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;
}
4

3 回答 3

5

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

于 2012-12-18T15:27:42.653 回答
0

您需要为“可能是二维数组”中的每一行分配内存,您只需为第一行分配内存,然后让每个指针指向相同的数据。这没有任何意义。

您不检查第一个 malloc 调用是否成功。

你不应该从这个函数中调用 free 。

最好用相邻分配的内存单元创建一个真正的二维数组,而不是一些指针对指针的混乱。

于 2012-12-18T15:41:36.903 回答
0

我在这里粘贴了我的部分代码

int *nn,*kk;
int main()
{
int t=0,i;

scanf("%d",&t);
int maxx=0;
nn = new int [t];
kk = new int [t];
for(i=0;i<t;i++)
{
    scanf("%d%d",&n,&k);
    nn[i] = n;
    kk[i] = k;
    if(maxx<n)
        maxx=n;
        cout<<nn[i]<<" "<<kk[i]<<endl;
}
t=0;
for(i=0;i<t;i++)
{
    n = nn[i];
    k = kk[i];cout<<nn[i]<<" "<<kk[i]<<endl;
    //cout<<setprecision(6);
   if(k<34&&n>k)
        //cout<<a[n][k]<<endl;
        printf("%0.7lf\n",a[n][k]);
    else
        printf("0.000000\n");//cout<<"0\n";
}
delete []nn;
delete []kk;
return 0;
}
于 2013-03-10T04:37:22.200 回答