二维数组的动态分配,指针。灌装、印刷
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;
}
问题是您在 fillIn
和 print
函数中传递给我们的双指针(指向指针的指针)。错了,完全错了。
或者好吧,它可以使用,但是你需要在那些函数 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;
我正在尝试使用指针动态分配和操作二维数组。我是指针的新手,所以当我 运行 这个程序时,它给出了“分段错误”。这里有什么问题?
我也用了 (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;
}
问题是您在 fillIn
和 print
函数中传递给我们的双指针(指向指针的指针)。错了,完全错了。
或者好吧,它可以使用,但是你需要在那些函数 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;