c - 我想知道我在 C 中如何错误地读取(或写入)数组中的元素?

标签 c arrays

我正在尝试使用二维数组在 C 中绘制帕斯卡三角形。

我认为出了问题与我读取或写入数组的方式有关。当我在(第一个)for 循环中查找数字时,我正在做的事情似乎有效,但在它之外不起作用?

我是在用 Python 编写一些代码之后才想到这个的,并且是 C 的新手

这是我的代码:

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

void main()
{
    int n, i , j;
    int x[n][n];

    n = 4;
    for (j=0; j<n; j++)
    {
      for(i=0; i<n; i++)
      {
        if (i == 0)
        {
            x[0][j] = 1;
            printf("\n(%d, %d)", i,j);
        }
        if (i != 0)
        {
            x[i][j] = 0;
        }
        printf("%d", x[i][j]);
      }
    }

    printf("\n\n(x[0][0]) %d", x[0][0]);
    printf("\n");

    for(i = 0; i < n; i++)
    {
      for(j = 0; j < (n); j++)
      {
        if (j == 0)
        {
            printf("\n%d    ", x[i][j]);
        }
        else
        {
            x[i][j] = x[i-1][j-1] + x[i][j-1];
            printf("%d  ", x[i ][j ]);
        }
      }
    }
    printf("\n");   
    return;
  }

任何帮助将不胜感激

最佳答案

我在第二组循环中看到的一个关键问题是以下行:

x[i][j] = x[i-1][j-1] + x[i][j-1];

如果 j == 0,则可以避免这种情况,但如果 i == 0,则不能。例如,当 j == 1 但 i == 0 时,您将尝试访问数组中 x[-1][ 处的位置0] 位于数组分配的内存之外。

我认为您特别想将第二组循环更改为如下所示:

for(i = 0; i < n; i++)
{
  for(j = 0; j < (n); j++)
  {
    if ((i == 0) || (j == 0))
    {
        printf("\n%d    ", x[i][j]);
    }
    else
    {
        x[i][j] = x[i-1][j-1] + x[i][j-1];
        printf("%d  ", x[i ][j ]);
    }
  }
}

请注意,内部 if 条件已从 if (j == 0) 更改为 if ((i == 0) || (j == 0)) 以防止索引超出数组范围。

关于c - 我想知道我在 C 中如何错误地读取(或写入)数组中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41770663/

相关文章:

C++将时间字符串转换为纪元的秒数

c - 在程序中实现指针

javascript - 如何使数组过滤器与异步函数端一起工作?

C++:如何将更改应用于动态数组交叉函数?

python - 优化三个数组上的现有 for 循环

php - 计算子/子数组中的条目

c - 使用 fgets 读取输入(进入无限循环)

c - 如何返回结构类型的函数的返回值?

C - 隐藏结构的实现

python - 元素的 numpy 条件格式