如何在C中修复这个二维数组?

时间:2016-07-08 11:32:55

标签: c

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

int main(void)
{
    int n, m, i, j, status, maxr = 0, maxc = 9, temp;
    int k, q, r , state = 0, t = 1;
    int ar[n][m];
    puts("Enter two numbers represents two dimensional array, N * M");
    puts("This program will find the saddle points");
    puts("The numbers in arrays is totally random");
    srand((unsigned int) time(0));  //randomize seed
    while (status = scanf("%d %d", &n, &m) != 2)
    {
        if (status == EOF)
            break;
        else
        {
            puts("You should have entered two integers");
            puts("Try again");
            while (getchar() != '\n')
                continue;
            puts("Enter two numbers represents two dimensional array, N * M");
            continue;
        }
    }

    for (j = 0; j < m; j++) //establish a random two dimensional array
    {
        for (i = 0; i < n; i++)
        {
            ar[i][j] = (rand() % 10);
            printf("%d\n", ar[i][j]);
        }
    }

    for (j = 0; j < m; j++)
    {
        for (i = 0; i < n; i++)
        {
            printf("%d\n", ar[i][j]);
        }
    }

}

我想创建一个包含随机数的二维数组。所以我使用rand()函数,并使用srand函数随机播种。

现在我确信我得到随机数,但似乎我无法将这些随机数保存到数组中。为了验证这一点,我创建了两个循环循环,事实证明结果是不同的。数组a[i][j]应该相同,但实际上是不同的。

那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

首先,nm未初始化为任何已知值。您需要在 nm之后声明该数组

修复该错误后,对于定义为int ar[n][m];的数组,您必须像这样迭代它:

for(int x=0; x<n; x++)
  for(int(y=0; y<m; y++)
    ar[x][y] = ....;

不仅要防止明显的越界错误,还要保证最佳使用数据缓存。给定数组数据ar[2][3] = {{1, 2, 3}, {4, 5, 6}},它作为

存储在内存中
1 2 3 4 5 6

这是缓存友好的,因为所有值都是相邻存储的。如果从左到右遍历这个内存,那么数组可以存储在高速缓冲存储器中,并且CPU不需要在循环中的每一圈从RAM中获取值,这样会慢一些。

答案 1 :(得分:1)

n和m在声明数组时具有不确定的值。

int n, m;

int ar[n][m]; // can be any value for n and m

你应该阅读动态分配数组