每次我将第一个整数放入数组时,方法都会崩溃.操作不良



我有一个用整数填充数组的方法:

void  fill(int* a[], int dim1, int dim2)
{
int intinArray = 0;
for(int i=0;i<dim1;i++)
  {
    for(int j=0;j<dim2;j++)
    {
    cin >> intinArray;
    a[i][j] = intinArray;
    }
  }
}

如果我在方法main()中声明数组,如下所示:

int** tab;
fill(tab,3,3);

当我把第一个整数放在cin中时,它崩溃了。为什么?如果此行有问题:

a[i][j] = intinArray;

我应该如何更改它?

代码的根本错误在于你声明了指针,但没有任何地方初始化指针来指向某个地方。 您将指针视为常规的旧二维整数数组。 因此,如果它如此简单,为什么要使用指针呢?

鉴于这是指针使用的基础,而您显然没有这样做,解决方案是查看使用指针的工作代码。

int main()
{
  int *p;  // uninitialized -- points to who-knows-where
  *p = 10;  // this is undefined behavior and may crash
}

获取该代码并了解为什么它也可能会崩溃。该指针指向"我们不知道",然后您将 10 分配给您、我和阅读此答案的其他人都不知道的位置。 看到问题了吗? 要修复它,您必须初始化指针以指向有效的某个位置,然后您可以取消引用它并分配给它而不会出错。

int main()
{
  int *p;  // uninitialized -- points to who-knows-where
  int x = 20;
  p = &x;  // this is now ok, since p points to x
  *p = 20;  // now x changes to 20
}

你的问题出在这个代码中

int** tab; // <- this one
fill(tab,3,3);

您声明了一个指针,并在假设它指向分配的内存的情况下使用它。(我想混淆的来源是,对于C++对象,情况并非如此)

指针

是指针 - 它指向内存中的某个位置。无法保证它指向的值有效,除非您明确确保它是您自己。阅读PaulMcKenzie的答案,了解有关指针的更多信息。

尝试

int tab[x][y] = {{0}}; 
fill(tab,3,3);

其中 x 和 y 定义 2D 阵列的宽度和高度。您必须处理应用程序的边界检查。请注意,将 {{0}} 更改为非零数字不会将所有内容初始化为该数字。

最新更新