【问题标题】:Dynamic Allocation of 2d Array, pointers. filling, printing二维数组、指针的动态分配。灌装、印刷
【发布时间】:2021-03-17 10:28:04
【问题描述】:

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

我也用 (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; 
}

【问题讨论】:

  • 'for(int j = 0 ; j
  • 错误调试失败 - 如果您打印出索引,您会发现 'j' 不会改变:((
  • 你可以通过学习如何在开发更多应用程序之前进行基本调试来感谢我,(使用 gdb,也许:)
  • 好的,我开始
  • 如果您使用的是 Windows,您可以下载 Codeblocks。预装了 gcc 和 gdb,调试器相当容易使用。总体上对新手非常友好,至少就专业工具链而言。

标签: c pointers dynamic-memory-allocation


【解决方案1】:

问题在于您在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,另一个取消引用计算出的指针。

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

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

现在可能更容易看出你原来的表达出了什么问题。

为了清楚起见,你原来的表达是这样的:

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

【讨论】:

  • 实际上我想要指针的指针,这就是我使用 **grid 的原因,我如何在 thoise 函数中取消引用指针网格?
  • @UglyMicha for(int j = 0 ; j &lt; c; i++) 看到那个循环有问题了吗? (归功于马丁詹姆斯)
猜你喜欢
  • 2016-08-06
  • 2013-03-07
  • 2013-04-06
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多