看看下面这段代码的输出,希望大家分析一下原因。
#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编译)
没看懂你用的啥编译器,反正我是没觉得能编译过,在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},则会警告超过超过范围。还是那句,警告可以被设置成就是错误。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。