首页 > 试题广场 >

关于结构类型下面哪一种说法是错误的?

[单选题]
关于结构类型下面说法错误的是()

  • 结构类型不可作为其成员的类型
  • 结构变量的大小就是其各成员的大小之和
  • 结构类型可以定义在函数之外
  • 结构类型可以定义在函数之中
推荐
B

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;
  • 结构类型无法将自己的类型作为其成员的类型,因为自己的类型定义尚不完整,要在结束的大括号(})后才算定义完整。所以A正确。
  • 基于内存的对齐原则,一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算),所以B错误
  • 结构类型和其他基本类型或数组类型类似的用法,可以定义在函数之中或函数之外。所以C、D正确。

编辑于 2019-09-09 14:13:47 回复(2)
结构体不能定义自身类型的成员,但是可以定义自身类型成员的指针,因为指针的大小是固定的,而自身成员大小,在未定义完成前是不确定的。
发表于 2020-11-04 00:19:30 回复(0)
选B,因为结构体存在字节对齐机制,所以结构变量的大小可能会比各成员大小之和要大。
发表于 2019-09-06 14:48:11 回复(0)
B选项结构体变量大小计算规则有3点:

结构体中的偏移量

结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。

结构体大小计算

结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。

结构体内偏移规则

1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。

2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。


作者:studystudy
链接:https://www.jianshu.com/p/1c8fa9c3bd38
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表于 2020-05-22 22:30:40 回复(2)
结构体的字节对齐机制
结构变量大小各成员大小之和
发表于 2021-07-19 21:47:45 回复(0)
结构体不能定义自身类型的成员,但可以定义自身类型成员的指针。结构变量大小大于等于各成员大小之和。
发表于 2022-01-16 09:13:06 回复(0)
选B    第一次做,我选错了,在这里总结下

类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数
struct MyStruct{
  double dda1;
  char dda;
  int type
};
对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?
也许你会这样求:sizeof(MyStruct) = sizeof(double)+sizeof(char)+sizeof(int) = 13
但当在VC中测试上面结构的大小时, sizeof(MyStruct) = 16
为了满足字节对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西)
所以整个结构的大小为:sizeof(MyStruct)=8+1+ 3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
编辑于 2020-05-04 22:05:04 回复(1)

可以定义指针哈

发表于 2020-03-31 17:00:52 回复(0)
struct A{}; struct B{ A X; }; 这样不合适?A选项不是这个意思?
发表于 2019-10-28 23:27:37 回复(2)
A为何不对?那链表怎么定义的?
发表于 2020-08-18 11:50:54 回复(2)

但是结构体里面可以定义该类型的指针,因为指针类型大小已知

发表于 2020-03-06 17:36:06 回复(0)
结构体变量大小计算规则有3点: 结构体中的偏移量 结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。 结构体大小计算 结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。 结构体内偏移规则 1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。 2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。
发表于 2022-01-11 17:45:28 回复(1)
会存在结构体内存对齐方面的知识
编辑于 2024-02-27 16:17:52 回复(0)
考虑字节对齐
发表于 2023-10-24 15:07:21 回复(0)
结构体大小还要进行字节对齐操作
发表于 2023-09-10 09:39:49 回复(0)
请问c是什么意思呀
发表于 2023-02-22 22:16:17 回复(0)
编辑于 2022-03-15 16:46:52 回复(0)
结构体内各个成员所需要的储存空间是在编译时候确定的,如果在结构体内定义结构体,实际上这时候结构体的大小还不知道有多大。但是可以定义指针,因为指针大小固定
发表于 2022-03-10 10:31:11 回复(0)
结构体的内存对齐也是c++常考点
公式1:前面的地址必须是后面的地址正数倍,不是就补齐
公式2:整个Struct的地址必须是最大字节的整数倍
发表于 2021-05-09 18:55:14 回复(0)
<p>如果结构体内部有个指针,不是可以定义成自身类型的指针吗?</p><p><br></p>
发表于 2020-11-30 21:37:05 回复(0)
A : 链表中不是有一个本结构体类型的指针吗?
发表于 2020-09-02 14:56:41 回复(0)