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

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. [BZOJ2588]Count on a tree(LCA+主席树)

    题面 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问 ...

  2. Codeforces Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    传送门 A. XORinacci 手玩三四项发现序列就是 $a,b,a\ xor\ b,a,b,...$,直接输出即可 #include<iostream> #include<cst ...

  3. Gradle Could not find method leftShift() for arguments

    task hello << { println 'Hello world!' } 其中 << 在gradle 在5.1 之后废弃了 可以查看gradle 版本号 gradle ...

  4. Viewer.js – 强大的JS/jQuery图片查看器

    简介 Viewer.js 是一款强大的图片查看器,像门户网站一般都会有各自的图片查看器,如果您正需要一款强大的图片查看器,也许 Viewer.js 是一个很好的选择.Viewer.js 有以下特点: ...

  5. 剑指offer--字符串

    C/C++中每个字符串都以字符'\0'作为结尾,这样我们就可以很方便的找到字符串最后的尾部.由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界. 为了节省内存,C/C++把 ...

  6. Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例

    ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...

  7. TensorFlow——实现线性回归算法

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt #使用numpy生成200个随机点 x_data= ...

  8. C# 给DataTable去重

    using System; using System.Data; namespace DelegateTest { public class Program { public static void ...

  9. nodejs 模板引擎

    自制替换模板 template.js var fs = require('fs') var http = require('http') var server = http.createServer( ...

  10. break语句、continue语句、goto语句的用法辨析

    1.break语句 break语句常使用在switch语句.循环体以及if语句中,它的作用是跳出循环,而且只能跳出一层循环. for (i = 0; i < 10; ++j) { for (j ...