数组的初始化与字符串

1、C/C++数组初始化,数组赋值

以下赋值方式是错误的:

[cpp]
int a4[3] = {};                //无法通过编译;//不能分配常量大小为0的数组 
char s3[3] = "abc";            //编译错误,数组越界。  

上一段中,第二个例子之所以错误,是因为“abc”是字符串有4个字符,除了a/b/c三个字符之外,还有一个结束字符 '\0'
摘自:
http://blog.csdn.net/maxsky/article/details/41547399
http://blog.csdn.net/lanceleng/article/details/8707745

2、c/c++数组初始化误区

int型数组

int szTmp[256] = {0};
int szTmp2[256] = {1};

一开始总认为szTmp的值就全部是0,szTmp2的值全部是1。
结果打印一看,szTmp的值就全部是0,但是szTmp2的第一个值是1,其他的全部是0。

原因: int szTmp[256]={var}; 第一个元素是显式地初始化为var,其余元素是隐式地初始化为0。

char型字符型数组

char str[10]="Hello";
char str[10]={"Hello"};
char str[10]={'H','e','l','l','o','\0'};
char str[10]={'H'};
char str[10]={0};

char str[10]="Hello, world.\n";//报错

char str[]="Hello, world.\n";

第一种情况:初始化数据小于数组长度
如前面三个初始化的例子,这三个例子的效果一样,前五个字符为Hello,剩余的用'\0'填充
第四行与第五行,都只指定了第一个字符,剩余的全部用'\0'填充。第五个例子相当将整个数组初始化为'\0'

第二种情况:初始化数据等于或超过数据长度,这种情况下,编译报错,溢出。

第三种情况:不指定数组长度
这种情况下,数组部分如果不含有明确指定的'\0',那么编译时会被自动添加一个'\0';

在数组不含有明确的'\0'时,sizeof(str)=strlen(str)+1;

3、在这里顺便再跟大家一起温习一下数组初始化规则:

1.指定数组大小的情况下:
(1)如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为0。

例如 int v5[8]={1,2,3,4};等价于 int v5[8]={1,2,3,4,0,0,0,0};

(2) 如果初始化时指定的的元素个数与数组大小相等,则数组元素就按照列表初始化

例如 int v5[4]={1,2,3,4};

2.没有指定数值大小的情况下:
当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定

例如 int v5[] ={1,2,3,4}; //数值的大小为4

4、int a[2];//里面的全是垃圾值

一般来说 全局变量、静态变量处于数据区,默认初始化为0 (如果指定初始值,则为指定的值)。而局部变量处于栈区,其数值是随机的,即当时内存中的值,全是垃圾值
总体来说
不要利用编译器的这种默认原则,
而是应当显示的指定,
必要的初始化不是笨拙,
而是规范。
参考网址

5、字符串和字符串结束标志

最经常使用的是以字符串常量的方式初始化字符数组,并可以省略{}一般的字符数组和数组不省略{}
static char c[] = "I am happy";
该字符串长度为11(因字符串常量最后由系统自动增加一个’\0’)
等价于
static char c[]={'I',’ ’,'a','m',‘ ','h','a','p','p','y','\0'};

字符数组并不要求它的最后一个字为‘\0’,甚至可以不包含‘\0’。以下这样写完全是合法的:
static char c[5]={'C','h','i','n','a'};//合法
但这样的字符串在printf输出时有风险:
printf(“%s”,c);//数组最后一个元素不是'\0'导致越界,输出不正常烫烫

为了使字符数组字符串常量在处理方法一致,便于测定字符序列的实际长度在字符数组中也常常人为地加上一个‘\0’, 如:
static char c[6]={'C','h','i','n','a','\0'};

char *str = {"ssss"};//字符串常量*str 和str[] 所存的位置不同,另片细述
当使用printf()输出时,格式化时选择%s,会输出ssss,由于printf遇到结尾符号‘\0’即停止显示打印。
字符串“ssss”是个常量,存储在一片连续的内存中,末尾有结尾符表示字符串的结束。
所有的字符串常量都被放在静态内存区。
因为字符串常量很少需要修改,放在静态内存区会提高效率。
参考网址

C语言中字符串常量到底存在哪了?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容