数组初始化

来源:互联网 发布:以前流行的网络歌曲 编辑:程序博客网 时间:2024/05/16 00:59

 

这是很基础的东西,但基础的重要性不言而喻,我敢肯定这个知识点我肯定曾经了解过,但现在,我不敢确定,由此可见纪录的重要性,这世界没有什么捷径,找对方向,然后不停重复.所以从今天开始,我会比较详细的纪录这些比较小的知识点,其实还是有不少有意思的地方的.


    写这篇文章的起因在于<<COM技术内幕>>第七章新东西太多,看的我目不暇接,所以在网上找了些例子看,其中就有一个例子中出现了这样的语句:

...
wchar_t wname[
128]=...{0};
char cname[256]=...{0};
...

我感兴趣的是:
1.这种赋值的结果.
2.这种形式是否符合标准编码规则?

我找到了如下资料,可能有助于对这个知识点的掌握.

/**//*
初始化值的个数可少于数组元素个数.当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0(全局或静态数组)或为不确定值(局部数组).
*/

我相信上面的资料是C和C++语言的标准规范,但实际编译器处理时,可能会和规范有所不同.因为编译器原则上要遵从语言规范,但对于局部数组的不确定值到底是多少,怎么处理,编译器就可以灵活处理.我测试了三种编译器,其实编译器赋予的值是固定的,都是0.

在这篇blog中 http://hi.baidu.com/widebright/blog/item/a024bc09631402256b60fbd0.html 谈论了相同的话题,现对其摘录如下:

/**//*
一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1.
调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下

5.2.1   数组初始化
数组可以用一个列值来初始化,例如
         int v1[] ={1,2,3,4};
         char v2[]={'a','b','c',0};
当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
         char   v3[2] ={'a','b',0};   //错误:太多的初始化值了
         char   v3[3] ={'a','b',0};   //正确

如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为   0。例如
         int   v5[8]={1,2,3,4};
等价于
          int   v5[8]={1,2,3,4,0,0,0,0};

注意没有如下形式的数组赋值:
         void f()
         {
             v4={'c','d',0};   //错误:不是数组赋值
         }
如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。
        字符数组可以方便地采用字符串直接初始化(参考第五章 2.2小节)
         译注: 就是 这样啦   char   alpha []="abcdefghijklmn";

*/
 
 
 

在全局声明的数组与在局部声明的数组有着不同的效果。
 
首先来看一个程序:
 
#include <stdio.h> 
#include <stdlib.h> 
#define MAX 10 
char a[MAX]; 
int main() 

    int i; 
    char b[MAX]; 
    char *c=(char *)malloc(MAX * sizeof(char)); 
    printf("\nArray a:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",a[i]); 
         
    printf("\nArray b:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",b[i]); 
         
    printf("\nArray c:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",c[i]); 
    printf("\nDone"); 
    free(c); 
    return 1; 
}
 
编译运行结果:
 


程序主要功能是打印字符数组的Ascii码。可以发现全局数组a和动态生成的数组c有着相同的结果,而局部声明的数组b确被分配了随机的数值,也许这就是问题的所在。
 
解决方案:
 
#include <stdio.h> 
#include <stdlib.h> 
#define MAX 10 
char a[MAX]={0}; 
int main() 

    int i; 
    char b[MAX]={0}; 
    char *c=(char *)malloc(MAX * sizeof(char)); 
    printf("\nArray a:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",a[i]); 
         
    printf("\nArray b:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",b[i]); 
         
    printf("\nArray c:\n"); 
    for(i=0;i<MAX;i++) 
        printf("%d  ",c[i]); 
    printf("\nDone"); 
    free(c); 
    return 1; 
}
 
运行结果:
 
 
 
 
 http://www.linuxidc.com/Linux/2012-12/75737.htm

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 合肥办健康证怎么办 个人办理健康证怎么办 身份证丢失怎么办健康证 个人怎么办武汉健康证 山海关古御壹号怎么办房本? 车玻璃被炮烧了怎么办 奔驰钥匙没电怎么办 婚内买的车离婚怎么办 离心风机噪音大怎么办 匹凸匹被st五牛怎么办 考不进去中学怎么办 教师体检来例假怎么办 老板拖欠农民工工资怎么办 公司破产拖欠员工工资怎么办 白玉蜗牛下蛋了怎么办 黄牛卖不出的票怎么办 鸡受风寒不产蛋怎么办 蛋鸡感冒不下蛋怎么办 牛肉煮老了怎么办 牛肉炖碎了怎么办 比值审敛法等于1怎么办 华为手机停止运行怎么办 易事通卡怎么办延期 三星手机照相机故障怎么办 凌晨一点到机场怎么办 凌晨3点醒来怎么办 凌晨四五点咳嗽怎么办 凌晨4点大便怎么办 熊猫小课付了费怎么办 华为手机系统升级后卡机怎么办 孕妇汗脚脚臭怎么办 巴基斯坦留学生丢失护照怎么办 vivox20耳机进水了怎么办 轴圆齿之间间隙大怎么办 浩辰cad2017保存不了怎么办 会议无poster版块怎么办 大四考研失败了怎么办 博士退学老师不同意怎么办? 贴双眼皮眼皮松怎么办 dpf灯亮了怎么办 60岁社保没交满怎么办