typedef struct { char str[10]; } SElemType; // 含固定陣列
typedef struct {
SElemType *base; // 指標
SElemType *top; // 指標
int stacksize;
} SqStack;
SqStack Sq[10]; // 陣列
SqStack 大小 = 指標(8) + 指標(8) + int(4) + 對齊填充(4) = 24 位元組 (64 位系統)。Sq[10] 連續佔用 240 位元組,每個元素的 base、top 為未初始化指標(棧上垃圾值),stacksize 同理。SElemType.str[10] 不存在於 Sq 陣列中,因為 SqStack 只有指標,沒有內嵌 SElemType 物件。指標指向的記憶體需另行 malloc。for (int i = 0; i < 10; i++) {
Sq[i].base = malloc(MAX * sizeof(SElemType));
Sq[i].top = Sq[i].base;
Sq[i].stacksize = MAX;
}
// 使用完畢
for (int i = 0; i < 10; i++) free(Sq[i].base);
typedef struct {
SElemType data[100]; // 內嵌,編譯期定長
int top;
int stacksize;
} SqStack2;
// SqStack2 直接包含 100 * sizeof(SElemType) 位元組,無需 malloc
| 特性 | 指標成員 | 內嵌陣列 |
|---|---|---|
| 大小固定 | 否(執行期分配) | 是(編譯期常量) |
| 彈性 | 高(可動態調整容量) | 低 |
| 記憶體碎片 | 可能 | 無 |
| 複製語義 | 淺拷貝需手動深拷貝 | 預設逐位複製即可 |
理解「指標 ≠ 陣列」,記憶體圖像化思考,避免未初始化指標解引用崩潰。