我正在使用结构并且对它们有几个问题。据我了解,结构变量将按顺序放置在内存中。块(字)的长度取决于机器架构(32 位 - 4 字节,64 位 - 8 字节)。
假设我们有 2 个数据结构:
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
在内存中它将是:
32 bit - 20 bytes
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
c1| PB| s | s | c1| PB| PB| PB| d | d | d | d | d | d | d | d | i | i | i | i |
64 bit - 24 bytes | 20 | 21 | 22 | 23 |
previous sequence + ---------------------
| PB | PB | PB | PB |
但是我们可以重新排列它,使这些数据适合机器字。像这样:
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
在这种情况下,对于 32 位和 64 位,它将以相同的方式表示(16 个字节):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
d | d | d | d | d | d | d | d | i | i | i | i | s | s | ch1| ch2|
我有一些问题:
- 这就像疯狂的猜测,但主要规则
struct
是在开始时定义更大尺寸的变量? - 据我了解,它不适用于独立变量。喜欢
char str[] = "Hello";
? - 填充字节,它有什么代码?它在 ASCII 表的某个地方吗?抱歉,没找到。
- 2个结构,所有成员都由不同的地址表示在内存中,它们可以不按顺序放置在内存中吗?
- 这样的结构:
struct ST3 { char c1; char c2; char c3;} st3;
Hassize = 3
,我知道如果我们将一个其他类型的成员添加到其中,它将被对齐。但是为什么它之前没有对齐呢?