开发者社区> 问答> 正文

sizeof输出引出对C语言定义变量后的初始化的理解?报错

看看下面这段代码的输出,希望大家分析一下原因。

#include<stdio.h>
int main()
{
        char last[6]={{1},{2},{3},{4},{5},{6},{7}};
        printf("The size is:%d\n",sizeof(last));
        return 0;
}
我编译时会出现如此警告:

simon@simon-Presario:~/heps/CWork$ gcc -Wall sizeofchar.c -o sizeofchar
sizeofchar.c: In function ‘main’:
sizeofchar.c:4:2: warning: braces around scalar initializer [enabled by default]
sizeofchar.c:4:2: warning: (near initialization for ‘last[0]’) [enabled by default]
sizeofchar.c:4:2: warning: braces around scalar initializer [enabled by default]
sizeofchar.c:4:2: warning: (near initialization for ‘last[1]’) [enabled by default]

……

{{1},{2},{3},{4},{5},{6},{7}};
这种形式理解为数组还是结构体?对于last[6]会什么是警告而不是报错?(gcc编译)

展开
收起
爱吃鱼的程序员 2020-06-22 17:42:15 606 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    没看懂你用的啥编译器,反正我是没觉得能编译过,在VS一跑,直接C2078

    charlast[6]={{1},{2},{3},{4},{5},{6},{7}};其实等价于 charlast[6][1]={{1},{2},{3},{4},{5},{6},{7}};

    编译器都会告诉你初始值过多。如果全优化生成后,main函数的堆栈其实会是

    0x1000RETADDR0x0FFCEBP0x0FFB...<-last[5]0x0FF6....<-last[0]如果第七个元素可以被赋值,那会赋值到哪里去?如果EBP被篡改了,那会出现什么情况?

    回复 @2007robot:没用过GCC,不过听说很多GCC能通过的奇葩代码在MSComplier就无法编译通过。比如说这里,如果GCC将last视为结构体,然后默认8字节对齐,然后你懂的,自然是可以通过的,当然GCC如果这么做,其实已经违背了“等价编译”的原则。这种编译器间的奇葩差异 @中山野鬼也许知道用gcc编译的,我也很纳闷最后一个元素放在哪儿了?warning可以设置为就是错嘛。哈。sizeof(last)肯定是6,这个跑不掉。因为我记得c标准有段要求,sizeof(array)/sizeof(array[0])要为数组的个数。你那种赋值gcc会给出警告。赋值方式错误。如果是{1,2,3,4,5,6,7},则会警告超过超过范围。还是那句,警告可以被设置成就是错误。

    引用来自“中山野鬼”的答案

    warning可以设置为就是错嘛。哈。sizeof(last)肯定是6,这个跑不掉。因为我记得c标准有段要求,sizeof(array)/sizeof(array[0])要为数组的个数。你那种赋值gcc会给出警告。赋值方式错误。如果是{1,2,3,4,5,6,7},则会警告超过超过范围。还是那句,警告可以被设置成就是错误。

    引用来自“艾米”的答案

    引用来自“中山野鬼”的答案

    warning可以设置为就是错嘛。哈。sizeof(last)肯定是6,这个跑不掉。因为我记得c标准有段要求,sizeof(array)/sizeof(array[0])要为数组的个数。你那种赋值gcc会给出警告。赋值方式错误。如果是{1,2,3,4,5,6,7},则会警告超过超过范围。还是那句,警告可以被设置成就是错误。弄成这样吧:charlast[6]={1,2,3,4,5,6};回复 @2007robot:有空纠结这个,不如和我一样Wall。对所有wanring地方的代码进行修复。warning:excesselementsinarrayinitializer(数组初始值设定项中有多余元素)[enabledbydefault]warning:(nearinitializationfor‘last’)[enabledbydefault]这是gcc的警告信息,没想到只是警告,感觉gcc还是把主动权交给程序员本身的一种编译器!
    2020-06-22 17:42:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载