很简单的一行代码,为什么就会报错呢?
不在结构体中就没有问题
这是错误信息
解决方案
5
简单说,就是不允许。
复杂的说呢,那就是猜了:
不在结构体里面的时候,不管是局部变量还是全局变量,编译器都要立即给他分配空间。分配了空间之后明确的知道这个变量的位置,那么顺便清0也可以做到。
在结构体里面,只是声明了一个类型而已,想清0也不知道该去哪清。当然你可以说真正定义变量的时候再清0,那就有点象c++构造函数的概念了,c大致是不行吧
1
5
C语言中不允许这么做,在结构体里面和外面赋值是完全不同的概念
外面定义的,无论是局部变量还是全局变量,都是有内存被分配的,初始化就是初始化那块儿内存
而结构体本身的定义并不分配内存,只有定义结构体变量时才会分配内存,所以在里面的初始化语句并不是在编译结构体定义时起作用,而是要等到用结构体定义变量时才起作用,所以就显得不那么“自然了”,所以C就没有支持这种方法
C++中先是用构造函数的方法给出了一种折衷手段,但也不允许直接初始化,而是用一个函数来完成你要的初始化工作,原因同上,就是为了避免写的代码和底层操作“不协调”
后来到C++11,可能是为了方便程序员,标准也开始支持这种类内直接初始化了
顺便说一下,Java是支持的,C++“抄袭”了Java也不是没有可能
5
每种语言,都有他的哲学,甚至有些库也有,例如STL
并且随着版本的不同,不断的修改,完善
早期,C 语言的哲学是尽量简单,贴近硬件,贴近汇编
包括写成的语句,和语言内核本身
当时C是关键字最少的语言
当时提倡代码简短,标识符名字尽量的简短(哦,那个时代,编程语言,普遍只能识别8个字符)
这点,可以从C标准库看出来
当然。编译器实现起来,也要尽量简单
当时,自动数组都不能初始化
结构内的数组。自然也不能初始化了
2
支持C++11编译器可以,例如VS2015
否则可以在构造函数里本人初始化为0
3
莫非你可以对 那个 top 赋值吗?
也是不可以的。
你那个不是定义变量,而是定义了一个类型。
不过最新的 C++ 就可以了。
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体中对字符数组初始化为0的问题!