我正在寫的矩陣乘法程序,以及保存代碼空間我創建了一個函數make
,需要一個指針到一個雙指針和動態地分配給定大小的2維陣列。數組a
和b
初始化爲[-2,2]中的隨機值。但是,當我嘗試在gcc上運行代碼時,出現seg故障。動態分配的數組 - 元素不可訪問
我通過GDB跑的代碼,當我嘗試設置b[0][0]
隨機數錯誤出現。當我嘗試在gdb打印b[0][0]
,我得到的錯誤:
Cannot access memory at address 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;
}
除了主要問題馬克·威爾金斯已經低於診斷,注意'如果'make'(一== NULL)'塊提供任何好處因爲你在函數的前面已經解除了'a'的引用。你應該刪除該代碼塊或將其移動到緊跟在'a' – simonc