鱼C论坛

 找回密码
 立即注册
查看: 2270|回复: 17

[已解决]数组指针在未赋值的情况下输出不明数值

[复制链接]
发表于 2018-9-5 18:36:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

这是输出结果

这是输出结果
#include<stdio.h>

int main(void)
{
    int a[5],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++;
            
        }  
        
 } 

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

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

使用道具 举报

发表于 2018-9-5 18:40:34 | 显示全部楼层
如果再执行一次的话,和这次的结果相同不?
就原理而言,如果数组不赋初始值的话,各项的值是随机的,就是取决于分配到的那块内存原有的数据。
没记错的话,应该是这样

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
迎风探雨 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 18:44:30 | 显示全部楼层
本来就会这样,该数组/变量是局部变量,所以编译器不会对该变量初始化,只会把内存空间给腾出来,内部是垃圾值。

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
迎风探雨 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

加入空格???
空格干啥用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有很大对的机率是分配回同一个内存空间,而数组已经被赋值。
只有【局部变量】才会是这样,const 除外
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 18:53:01 | 显示全部楼层
TyCk 发表于 2018-9-5 18:46
加入空格???
空格干啥用

for(...) 如果内部是由条件判断式作为结束条件,很容易出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对的,试了下,是相同的,看来是分配到同一个内存空间啦。
这是固定的机制么?
话说,加入适当的空格是说的啥意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是么?还真没注意过这个问题哎。
好吧,学习啦……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是固定机制,只是当前的内存空间没有别的程序占用,回去光顾而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那么,"回去光顾"是不是算是系统的一种机制呢,如果内存空间没被占用的话?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可以说算吧
路只有一条,没有必要跑那么远,找到最近的餐厅坐下来就好
系统也是懒惰的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈,这样还比较节省性能吧大概,本来还以为每次分配的地址肯定不同呢,果然天真啦
多谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2018-9-5 21:29:07 | 显示全部楼层
claws0n 发表于 2018-9-5 18:53
for(...) 如果内部是由条件判断式作为结束条件,很容易出错

我还是不太看得懂,空格是指for括号内的,还是{}内的?它的作用是视觉上的不易犯错,还是直接觉得程序循环的错误?还麻烦前辈举个这种情况的栗子,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

看不懂你在说啥~
1. 所谓的清空,其实是赋值为 0 。当程序退出后,基本上是不会去清空内存中【栈】的空间,因为没有必要。因此这些没有被清空的残留值叫系统垃圾值。
2. 当然可以进行运算,都是合法的数据,只不过你直接 int a  += 3; 的话,你不能保证下一次会得到同一个值,因为这取决于当时被分配到的空间有什么垃圾值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#include<stdio.h>

int main(void)
{
    int a[5], 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;  还是加上去好了
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 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++)?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 21:46:21 | 显示全部楼层
多谢二位前辈的指导和讨论,晚安
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表