突然想起来前几天同学问我为什么没有初始化的数组的值是随机的,发现这个困惑自己也是存在的,所以自己总结的心得.

1. 首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况:

    (1)全局数组,也就是定义在main函数外面的数组,元素的默认值是全部为0的

    (2)局部数组,定义在函数内部的数组,其值默认是随机的. 

#include <stdio.h>

#define LENGTH 5
int a[LENGTH]; int main()
{
for(int i=;i<LENGTH;i++){
printf("%d ",a[i]);
}
printf("\n"); int b[LENGTH];
for(int i=;i<LENGTH;i++){
printf("%d ",b[i]);
}
}

Process returned  (0x0)   execution time : 0.739 s
Press any key to continue.

  从代码结果可以清楚地看出来,全局数组与局部数组的默认值是不同的.

2.我们接下来再说局部数组为什么是随机的.局部数组是放在栈区的,而全局数组是放在静态区的.

  因为局部数组放在栈区,栈的操作就是入栈和出栈.我们声明数组,其实只是移动栈顶指针.而栈内的数据是上一次出栈时候遗留的数据.栈不会清空.所以数据是随机的.下面用一段代码说明.

#include <stdio.h>
void test();
int main()
{
test();
test();
} void test()
{
int a[];
for(int i=;i<;i++){
printf("%d ",a[i]);
}
printf("\n");
for(int i=;i<;i++){
a[i] =i;
}
for(int i=;i<;i++){
printf("%d ",a[i]);
}
printf("\n");
}
//输出结果

  当我们连续两次调用一个函数的时候.我们发现只有第一次的值似乎是随机的.因为我们两次相同的操作对栈的地址操作也是相同的.我们第一次函数对栈的修改并没有被栈清空,所以第二次的随机值就是第一次最后的数据了.

3.第二次更新,今天又想到了一个骚操作来证明.用的是c++.但是道理都是想通的.

因为重复运行这个代码局部数组的地址总是不变的,我的是0x6afed0. 可以通过

printf("%x",a);   //a为数组名

来获得数组名,用c++的地址转换将数组首地址赋值给指针sp,然后通过sp操作改变数组第一位的值.以此来解释未初始化的数组的值随机的来源.我们从最终结果可以看出来.内存空间中这个地址当时的值是什么.因为未初始化,所以显示的值就是什么.

#include <stdio.h>
#include <iostream> void test();
int main()
{
int* sp=reinterpret_cast<int *>(0x6afed0);
*sp = ;
test();
*sp = ;
test();
} void test()
{
int a[];
for(int i=;i<;i++){
printf("%d ",a[i]);
}
printf("\n");
for(int i=;i<;i++){
a[i] =i;
}
for(int i=;i<;i++){
printf("%d ",a[i]);
}
printf("\n");
} //输出结果

C语言的未初始化的数组的值为什么是随机的的更多相关文章

  1. C语言全局未初始化数据段分析

    前言: 在分析C语言全局未初始化变量时,发现在目标文件中全局未初始化变量并不是直接放在bss段中. 再后来发现在两个.c文件中定义同名的全局变量,链接时居然没有发生符号重定义错误.才知道C语言弱定义的 ...

  2. C语言中的未初始化变量的值

    C语言中未初始化的变量的值是0么 全局变量 .静态变量初始值为0局部变量,自动变量初始值随机分配 C语言中,定义局部变量时如果未初始化,则值是随机的,为什么? 定义局部变量,其实就是在栈中通过移动栈指 ...

  3. strlen()函数对一个未初始化数组的处理

    今天使用strlen时 ,发现一个问题,demo代码如下: #include <stdio.h> #include <stdlib.h> #include <string ...

  4. C语言程序设计(八) 数组

    第八章 数组 //L8-1 #include <stdio.h> int main() { int score1, score2, score3, score4, score5; int ...

  5. C++变量未进行初始化时的默认值

      对于built-in类型,未初始化的变量的值是undefined value. 对于自定义类型,未初始化变量的值是类型默认构造函数指定的值.  

  6. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  7. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  8. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  9. C语言指针的初始化和赋值

    1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示 ...

随机推荐

  1. [BZOJ 3731] Gty的超级妹子树 (树分块)

    [BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...

  2. servlet到springmvc的演进

    1.简单看看servlet 1.1.servlet继承关系 先看看下面servlet的这个继承关系,有点印象即可(可以暂时忽略ServletConfig,这个接口就是让我们可以从web.xml文件中拿 ...

  3. 音频视频的播放的进度调整(以.net为例)

    Background:对于音视频在线播放,一些小应用是靠nginx处理访问视频.音频文件的请求,对外应用的一般会托管至各种云上使用相关的服务.前者存在巨大的安全隐患,后者会有一定的成本.有的时候还是需 ...

  4. python学习笔记(13):python并发编程以及系统常用模块

    一.进程与线程 1.进程:程序的一次执行(程序装载入内存,系统分配资源运行).n 每个进程有自己的内存空间.数据栈等,只能使用进程间通讯,而不能直接共享信息 2.线程:所有线程运行在同一个进程中,共享 ...

  5. JavaScript、ES6中的类和对象

           面向对象可以用于描述现实世界的事物,但是事物分为具体的(特指的)事物和抽象的(泛指的)事物. 面向对象思维的特点: 1.抽取(抽象)对象共有的属性和行为组织(封装)成一个类(模板) 2. ...

  6. ajax图片上传(asp.net +jquery+ashx)

    一.建立Default.aspx页面 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile=&q ...

  7. 2018-11-15-UWP-how-to-get-the-touch-width

    title author date CreateTime categories UWP how to get the touch width lindexi 2018-11-15 18:49:12 + ...

  8. 树——binary-tree-maximum-path-sum(二叉树最大路径和)

    问题: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tr ...

  9. [python 学习] sax

    #!/usr/bin/python # -*- coding: UTF-8 -*- import xml.sax class MovieHandler( xml.sax.ContentHandler ...

  10. Java数组重修,猜数小游戏改进和打印正三角形

    数组重修,猜数小游戏 要求:从键盘输入一个数,判断数组是否包含此数,运用随机数 我们可能会这样写 import java.util.Random; import java.util.Scanner; ...