![]() |
1
47
|
![]() |
2
23
理解这一点的困难背后的问题可能是因为你混淆了数组和指针,就像很多人一样。然而,
. A
|
![]() |
3
14
例外情况是
1VLAs正式成为C99中C的一部分,但在此之前有些编译器支持它们。虽然不是C++的正式部分,但一些编译器(例如,G++)也将VLAS作为C++的扩展。 |
![]() |
4
10
|
![]() |
5
9
|
![]() |
6
5
与这里的其他答案相反,请注意,从C99开始,sizeof()是 不 必须在编译时确定,因为数组可能是可变长度的。 |
![]() |
7
3
|
![]() |
8
2
wiki :
|
![]() |
9
2
这个 sizeof operator “知道”所有原子数据类型的大小,因为结构、联合和数组只能通过组装原子类型来构造,所以很容易确定任何类型数组的大小。它使用基本算法来确定复杂类型(在编译时)。 |
![]() |
10
2
|
![]() |
11
1
Sizeof总是在编译时计算的。在多道编译器生成符号表时,编译器必须确定每个符号的大小,才能进一步生成中间代码。因此,对于所有sizeof reference,代码中的值都将替换确切的值。在中间代码生成阶段,所有运算符、语句都转换为正确的中间代码(ASM/其他格式)。最后,在m/c代码生成阶段将其转换为机器代码。 上面的一些讨论与sizeof有关的动态分配根本不在上下文中。任何对size(*p)的引用,其中p是任何数据类型的指针,编译器只是找出*p的数据类型并替换其大小,而不是检查分配块的MCB头以查看分配的内存大小。它不是在运行时。例如,double*p;sizeof(*p)仍然可以在不为指针p分配任何内存的情况下完成。这怎么可能呢? |
![]() |
12
1
sizeof在编译时计算。这就是为什么在创建动态数组时,要按以下方式创建它。
//现在在编译过程中,编译器可以确定char的大小。因为它必须在内存上对齐它们。在这一点上,操作系统知道需要分配多少大小。 可变长度数组 另一方面是在 . 但是任何malloc分配的内存都会在堆上创建。 |
![]() |
Rajesh · 添加偏移量时数组名称上的sizeof运算符 7 年前 |
![]() |
fatdragon · 结构具有并集时的意外大小 7 年前 |
![]() |
razorozx · C++如何获取父数据类型的sizeof? 7 年前 |
![]() |
WonFeiHong · 通过sizeof会发生什么 7 年前 |
![]() |
Sato · 如何使gcc警告未定义的结构? 7 年前 |
![]() |
msc · C和C中sizeof算子的不同输出++ 8 年前 |
![]() |
Raul GrigoraÈcu · 指向数组最后一个元素的C指针 8 年前 |