C 变量初始化

编译器:GCC 4.4.7
1、char p[12];
2、char p[12]={0x00};
3、char p[12];memset(p,0x00,12);

以上三种变量的初始化的差异是什么?
第一种是否被初始化为全0,还是p的各个字节都是默认随机内存?
第二种是否只设置了p[0]=0x00,其他字节都是默认随机值?
第三种是否是最“保险”的方式?比如紧接着有:

p[0]='a',p[1]='b';printf("%s",p);

阅读 4.6k
3 个回答

1,第一种根据编译器可能会有不同值,但是总的来不会是0,除非是全局变量,默认会是0
2,第二种全部会是0
3,第三种也全是0,和2一样只要有赋值出现,剩余元素不去赋值就是0。

2和3效果一样,但是哪种速度快要看反汇编代码。

一下是vs的code和运行结果:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char p1[12];
    char p2[12] = {[5]='c'};
    char p3[12]; memset(p3, 0x00, 12);

    for (int i = 0; i < 12; i++){
        printf("%d, %x\n", p1[i], p1[i]);
    }
    printf("\n");
    for (int i = 0; i < 12; i++){
        printf("%d, %x\n", p2[i], p2[i]);
    }
    printf("\n");
    for (int i = 0; i < 12; i++){
        printf("%d, %x\n", p3[i], p3[i]);
    }

    return 0;
}

图片描述

  1. 我不确定,C标准好像也没说,不建议这样做
  2. no
  3. yes

建议写个循环将p[0]到p[11]都打印出来就一目了然了

用方法2就足够了,没写明的都初始化为0

第一个写法,当且仅当p为全局变量时才会被初始化为全0,否则不负责变量初始化
第二个写法的意义是,将p[0]赋为0x00,将p[1]~p[11]赋为0(因为花括号里没写全,默认用0补全),说白了就是全0
第三个,反正你都memset了,显然全0

好了,对于你的第三个问题,其实写法二和写法三是等价的,没有什么保险之说,个人观点,反而是写法二代码更短更常用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进