二维数组的动态分配,指针。灌装、印刷

Dynamic Allocation of 2d Array, pointers. filling, printing

我正在尝试使用指针动态分配和操作二维数组。我是指针的新手,所以当我 运行 这个程序时,它给出了“分段错误”。这里有什么问题?

我也用了 (grid + i*c + j) 带一个星号,还是不行

#include <stdio.h> 
#include <stdlib.h>

float* DynamicAll(int row,int col){
    float *arr = (float *)malloc(row*col*sizeof(float));
    return arr;
}

void fillIn(float **grid, int r, int c){
    for(int i = 0 ; i < r ; i++){
        for(int j = 0 ; j < c; i++){
            **(grid + i*c + j) = i+j;
        }
    }
}

void print(float **grid, int r, int c){
    for(int i = 0 ; i < r ; i++){
        for(int j = 0 ; j < c; i++){
            printf("%f  ", **(grid + i*c + j));
        }
    }
}
  
int main() { 
   int row = 3, col = 3; 
   float *arr;
   arr = DynamicAll(row,col);
   fillIn(&arr,row,col);
   print(&arr,row,col);
   free(arr); 
   return 0; 
}

问题是您在 fillInprint 函数中传递给我们的双指针(指向指针的指针)。错了,完全错了。

或者好吧,它可以使用,但是你需要在那些函数 first 中取消引用指针 grid,然后再对其进行指针运算。

但我看不出有任何理由这样做,所以只需将指针 arr 按原样传递给函数(并相应地修改它:

// Note only single pointer here
//                v
void fillIn(float *grid, int r, int c){
    for(int i = 0 ; i < r ; i++){
        for(int j = 0 ; j < c; i++){
            // Only single dereference here
            *(grid + i*c + j) = i+j;
        }
    }
}

...

// Not using the address-of operator here
fillIn(arr, row, col);

如果出于某种未知原因,您坚持让指针指向指针,那么您必须先取消引用指针:

*(*grid + i*c + j) = i+j;

注意两个星号的位置,以及如何使用一个星号取消引用指针 grid,另一个取消引用计算指针。

还请注意,对于 any 指针或数组 p 和索引 i,表达式 *(p + i) 恰好是 等于 p[i]。这意味着表达式等于:

(*grid)[i*c + j] = i+j;

现在可能也更容易看出您的原始表达式有什么问题。

为清楚起见,您的原始表达式等于:

grid[i*c + j][0] = i+j;