迎风探雨 发表于 2018-9-5 18:36:00

数组指针在未赋值的情况下输出不明数值

#include<stdio.h>

int main(void)
{
    int a,i,*pa;
    pa=a;
    for(i=0;i<5;i++){
            *pa=i;
            pa++;
            printf("%d\n",*pa);
    }
      pa=a;
      for(i=0;i<5;i++){
               
            printf("a[%d]=%d\n",i,*pa);
            pa++;
           
        }
       
}

TyCk 发表于 2018-9-5 18:40:34

如果再执行一次的话,和这次的结果相同不?
就原理而言,如果数组不赋初始值的话,各项的值是随机的,就是取决于分配到的那块内存原有的数据。
没记错的话,应该是这样{:10_266:}

claws0n 发表于 2018-9-5 18:44:30

本来就会这样,该数组/变量是局部变量,所以编译器不会对该变量初始化,只会把内存空间给腾出来,内部是垃圾值。

请养成良好的习惯,加入适当的空格~~

TyCk 发表于 2018-9-5 18:46:58

claws0n 发表于 2018-9-5 18:44
本来就会这样,该数组/变量是局部变量,所以编译器不会对该变量初始化,只会把内存空间给腾出来,内部是垃 ...

加入空格???
空格干啥用{:10_257:}

claws0n 发表于 2018-9-5 18:50:56

TyCk 发表于 2018-9-5 18:40
如果再执行一次的话,和这次的结果相同不?
就原理而言,如果数组不赋初始值的话,各项的值是随机的,就是 ...

有很大对的机率是分配回同一个内存空间,而数组已经被赋值。
只有【局部变量】才会是这样,const 除外

claws0n 发表于 2018-9-5 18:53:01

TyCk 发表于 2018-9-5 18:46
加入空格???
空格干啥用

for(...) 如果内部是由条件判断式作为结束条件,很容易出错

TyCk 发表于 2018-9-5 18:53:13

claws0n 发表于 2018-9-5 18:50
有很大对的机率是分配回同一个内存空间,而数组已经被赋值。
只有【局部变量】才会是这样,const 除外

对的,试了下,是相同的,看来是分配到同一个内存空间啦。
这是固定的机制么?
话说,加入适当的空格是说的啥意思?{:10_256:}

TyCk 发表于 2018-9-5 18:55:18

claws0n 发表于 2018-9-5 18:53
for(...) 如果内部是由条件判断式作为结束条件,很容易出错

是么?还真没注意过这个问题哎。
好吧,学习啦……

claws0n 发表于 2018-9-5 19:03:41

TyCk 发表于 2018-9-5 18:53
对的,试了下,是相同的,看来是分配到同一个内存空间啦。
这是固定的机制么?
话说,加入适当的空格是 ...

不是固定机制,只是当前的内存空间没有别的程序占用,回去光顾而已

TyCk 发表于 2018-9-5 19:09:26

claws0n 发表于 2018-9-5 19:03
不是固定机制,只是当前的内存空间没有别的程序占用,回去光顾而已

那么,"回去光顾"是不是算是系统的一种机制呢,如果内存空间没被占用的话?{:10_327:}

claws0n 发表于 2018-9-5 19:14:40

TyCk 发表于 2018-9-5 19:09
那么,"回去光顾"是不是算是系统的一种机制呢,如果内存空间没被占用的话?

可以说算吧{:10_269:}
路只有一条,没有必要跑那么远,找到最近的餐厅坐下来就好{:10_279:}
系统也是懒惰的~

TyCk 发表于 2018-9-5 19:20:52

claws0n 发表于 2018-9-5 19:14
可以说算吧
路只有一条,没有必要跑那么远,找到最近的餐厅坐下来就好
系统也是懒 ...

哈哈,这样还比较节省性能吧大概,本来还以为每次分配的地址肯定不同呢,果然天真啦{:10_250:}
多谢哈{:10_256:}

迎风探雨 发表于 2018-9-5 21:15:45

claws0n 发表于 2018-9-5 18:44
本来就会这样,该数组/变量是局部变量,所以编译器不会对该变量初始化,只会把内存空间给腾出来,内部是垃 ...

前辈,你好,你这句话的意思是不是该未赋初值的地址处所存放的值在内存空间原本对应的二进制机器语言已经清零,而此处原本存放的值只是一个原本的影像而无法使用。(以上可能表述不到位,若不能理解,请不要纠结,这种问题也不是迫切的)
我试了一下,原本没用的值可以进行物理上的使用(加减乘除),所以,是不是相当于把该内存划分给数组,内存上的原住民任由驱逐或者做其他操作,但是在我们正常的使用中,原住民是没有意义的。

迎风探雨 发表于 2018-9-5 21:29:07

claws0n 发表于 2018-9-5 18:53
for(...) 如果内部是由条件判断式作为结束条件,很容易出错

我还是不太看得懂,空格是指for括号内的,还是{}内的?它的作用是视觉上的不易犯错,还是直接觉得程序循环的错误?还麻烦前辈举个这种情况的栗子,谢谢{:10_266:}

claws0n 发表于 2018-9-5 21:34:25

迎风探雨 发表于 2018-9-5 21:15
前辈,你好,你这句话的意思是不是该未赋初值的地址处所存放的值在内存空间原本对应的二进制机器语言已经 ...

{:10_282:} 看不懂你在说啥~
1. 所谓的清空,其实是赋值为 0 。当程序退出后,基本上是不会去清空内存中【栈】的空间,因为没有必要。因此这些没有被清空的残留值叫系统垃圾值。
2. 当然可以进行运算,都是合法的数据,只不过你直接 int a+= 3; 的话,你不能保证下一次会得到同一个值,因为这取决于当时被分配到的空间有什么垃圾值。

claws0n 发表于 2018-9-5 21:40:12

迎风探雨 发表于 2018-9-5 21:29
我还是不太看得懂,空格是指for括号内的,还是{}内的?它的作用是视觉上的不易犯错,还是直接觉得程序循 ...

#include<stdio.h>

int main(void)
{
    int a, i, *pa;
    pa = a;
    for(i = 0; i < 5; i++)
    {
      *pa = i;
      pa++;
      printf("%d\n", *pa);
    }
    pa = a;
    for(i = 0; i < 5; i++)
    {
      printf("a[%d]=%d\n", i, *pa);
      pa++;
    }
    return 0;还是加上去好了
}

迎风探雨 发表于 2018-9-5 21:41:31

claws0n 发表于 2018-9-5 21:34
看不懂你在说啥~
1. 所谓的清空,其实是赋值为 0 。当程序退出后,基本上是不会去清空内存中 ...

前辈,你的意思是不是把for(i=0;i<5;i++)改为for(i=0 ; i<5 ; i++)?

迎风探雨 发表于 2018-9-5 21:46:21

多谢二位前辈的指导和讨论,晚安{:10_279:}
页: [1]
查看完整版本: 数组指针在未赋值的情况下输出不明数值