dequantianhe 发表于 2019-12-14 14:45:52

怀疑人生啊!为啥循环给数组赋值会这样?!!

各位大佬,小弟通过给一个变长数组循环赋值时发现,每次内层循环完成后,之前的赋值就会被改变!!!

截图如下:
代码部分:


输出部分:


关键代码其实很简单,图片中加了一些语句为了测试用的,为了方便大神判断,下面把关键代码贴出:
#include<stdio.h>

int main()
{
        int m,p,i,j,a;

        printf("输入第一个数组的大小(m*p):");
        scanf("%d*%d",&m,&p);

        printf("给第一个数组赋值:\n");

        for(i = 0;i< m;i++)
        {
                for(j =0;j<p;j++)
                {
                        scanf("%d",&a);
                }
        }

//输出第一个数组

        for(i = 0;i< m;i++)
        {
                for(j =0;j<p;j++)
                {
                        printf("%d",a);
                }
                printf("\n");
        }
        return 0;
}

运行这段代码,输入与输出不一致,哪位大神来抢救一下!非常感谢!

superbe 发表于 2019-12-14 14:45:53

换下顺序,先输入m,p的值,再声明变长数组。
    int m, p, i, j;
    printf("输入第一个数组的大小(m*p):");
    scanf("%d*%d", &m, &p);
    int a;
    printf("给第一个数组赋值:\n");
    for (i = 0; i< m; i++)
    {
      for (j = 0; j<p; j++)
。。。。。。

dequantianhe 发表于 2019-12-14 17:28:07

superbe 发表于 2019-12-14 16:32
换下顺序,先输入m,p的值,再声明变长数组。
    int m, p, i, j;
    printf("输入第一个数组的大小(m* ...

卧槽,还真是这个问题!这背后有啥解释么?{:10_277:},以前没注意过这个细节!

superbe 发表于 2019-12-14 19:48:41

我的理解,虽然变长数组可以使用变量,但在运行时还是需要先知道大小才能分配内存。如果还没输入的话,可能使用的是m,p的垃圾值吧。

dequantianhe 发表于 2019-12-15 08:07:27

superbe 发表于 2019-12-14 19:48
我的理解,虽然变长数组可以使用变量,但在运行时还是需要先知道大小才能分配内存。如果还没输入的话,可能 ...

我感觉好像还是解释的不到位,即便是垃圾值,也很难解释为啥第一次赋值5个元素没问题,赋值下面5个元素时第一次赋值的元素会变化,而且会和第二次的值一样,这段代码完全执行完毕,4行的元素都有值,而且每行的都是相同的,每次执行都是这个结果,这说明这里存在一种必然,用mp的随机值还是解释不通~

superbe 发表于 2019-12-15 14:27:40

嗯,你说的对,内部原理我也没搞清楚。
页: [1]
查看完整版本: 怀疑人生啊!为啥循环给数组赋值会这样?!!