簡體   English   中英

將三重指針傳遞給函數,然后分配2d數組

[英]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]這類似於*adouble** ,但是你要設置在指針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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM