为什么c在第二次打印时打印出不同的数组?

时间:2018-01-02 08:30:16

标签: c arrays matrix

我的堂兄有一个学校项目,我们无法弄清楚为什么在没有数值变化的情况下第二次打印时阵列会有所不同?

基本上你输入一个数字来说明矩阵有多少行/列,在第一次循环中他给每个位置分配一个数字并输出随机数。然而,第二次我们通过矩阵时数字是不同的,似乎它们由于某种原因从左下角到右上角通过矩阵被复制。这对我们来说似乎很奇怪,因为在第一次定义数组后,我们从未为数组中的位置指定不同的值。

int i,j,n,matrica[i][j],suma=0;
srand(time(NULL));
printf("\nunesi prirodan broj N[3,20] = \n");
scanf("%d",&n);

for(i=0;i<n;i++) {
    for(j=0;j<n;j++) {
        matrica[i][j]=rand()%100;
        printf("%d, %d = %4d   ",i, j, matrica[i][j]);

        if(j==n-1) {
            printf("\n");
        }
    }
}

printf("\n");

for(i=0;i<n;i++) {
    for(j=0;j<n;j++) {
        printf("%d, %d = %4d   ", i, j, matrica[i][j]);

        if(j==n-1) {
            printf("\n");
        }
    }
}

这是结果(我在这里粘贴的代码有2个打印,在图像中有3个但是每次你在第一次完成后都会通过矩阵):

enter image description here

2 个答案:

答案 0 :(得分:3)

我们需要使用malloc来分配动态的内存量。

之后

 scanf("%d",&n) // PS You should check the return value - read the manual page

 matrica = malloc(sizeof(int) * n * n);

并声明为

int *matrica;

然后替换

matrica[i][j]

matrica[i * n + j]

在完成matrica之后 - 使用免费,即

free(matrica);

答案 1 :(得分:1)

int i,j,n,matrica[i][j]

此时我必须问一下,您认为ij会有什么价值?在那里,您通过引用使用您未初始化的自动存储持续时间声明的变量来调用未定义的行为。在这一点之后的任何事情都是......未定义的行为。

话虽如此,我注意到其他一些看起来很奇怪的部分。你正在读哪本书?我问的原因是,我认识的人在阅读有信誉的教科书时没有这些问题,因此你的教科书(或资源,无论如何)都不能为你工作......

我无法阅读字符串文字中的评论,这是一种耻辱,因为这通常是在问题中非常有价值的上下文信息。尽管如此,继续前进,如果这是我,我可能会在询问n之后声明指向int数组n的指针,如下所示:

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

int main(void) {
    size_t n;
    printf("Enter n, please: ");
    fflush(stdout);
    if (scanf("%zu", &n) != 1 || n == 0 || SIZE_MAX / n < n) {
        puts("Invalid input or arithmetic overflow...");
        return -1;
    }

    int (*array)[n] = malloc(n * sizeof *array);
    if (!array) {
        puts("Allocation error...");
        return -1;
    }

    /* now you can use array[0..(n-1)][0..(n-1)] as you might expect */

    free(array);
}

这应该适用于非常高的数字,远远高于int array[n][n];所代替的......并且它为您提供了一个选项来告诉用户这是一个&#34;分配错误......&# 34;而不仅仅是SIGSEGV,SIGILL,SIGBUS等......

...但是没有什么比保存用于生成随机数的种子和用户输入更优秀;这只是两个整数,不需要动态分配。存储rand生成的内容是没有意义的,你知道吗,对吧? rand可以纯粹使用寄存器存储生成该输出,寄存器存储是我们处理器中常用的最快内存。你不会用阵列击败它,没有意义,而不是......只是没有。