【发布时间】:2012-12-18 15:25:34
【问题描述】:
我正在编写一个矩阵乘法程序,为了节省代码空间,我创建了一个函数make,它接受一个指向双指针的指针并动态分配一个给定大小的二维数组。数组 a 和 b 被初始化为 [-2, 2] 中的随机值。但是,当我尝试在 gcc 上运行代码时,出现了 seg 错误。
我通过 gdb 运行代码,当我尝试将 b[0][0] 设置为随机数时出现错误。当我尝试在 gdb 中打印 b[0][0] 时,出现错误:
无法访问地址 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;
}
【问题讨论】:
-
除了 Mark Wilkins 在下面诊断出的主要问题之外,请注意
make中的if (a == NULL)块没有任何好处,因为您在函数的前面已取消引用a。您应该删除该代码块或将其移动到立即分配a
标签: c pointers multidimensional-array