![](/img/trans.png)
[英]C: ERROR After mallocing and passing 2D char array to function
[英]passing a triple pointer into function then mallocing a 2d array
遇到分段錯誤並且不明白為什么,必須傳遞三重指針進行賦值,因此無法更改...
這是功能
void alloc2d(double*** a, int m, int n) {
int i, j;
**a = malloc(sizeof(double *) * m);
a[0] = malloc(sizeof(double) * n * m);
for(i = 0; i < m; i++)
a[i] = (*a + n * i);
}
這是該函數的調用...
double** m;
alloc2d(&m, 5, 10);
double count = 0.0;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 10; j++)
m[i][j] = ++count;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 10; j++)
printf("%f ", m[i][j]);
你要分配內存的指針,其中a
指。 更改**a = malloc(sizeof(double *) * m);
到*a = malloc(sizeof(double *) * m);
。 您已經為a[0]
分配了內存,所以從索引1
開始循環。 該類型的a[0]
這類似於*a
是double**
,但是你要設置在指針a[0]
指。 將a[0]
更改為(*a)[0]
a[i]
將a[i]
更改為(*a)[i]
。 像這樣修改您的代碼:
void alloc2d(double*** a, int m, int n) {
*a = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double*
(*a)[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double
for( int i=1; i<m; i++ )
(*a)[i] = (*a)[0] + n*i; // initialize the pointers for rows [1, m[
}
我認為這會更容易理解:
void alloc2d(double*** a, int m, int n) {
double **temp = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double*
temp[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double
for ( int i=1; i<m; i++ )
temp[i] = temp[0] + n*i; // initialize the pointers for rows [1, m[
*a = temp; // assign dynamic memory pointer to output parameter
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.