SqStack *OPTR, *OPND; // 全局指針未初始化
int main() {
InitStack(OPTR); // 傳遞未初始化的指針(野指針)
}
int InitStack(SqStack *S) {
S->base = (SElemType*)malloc(...); // 解引用野指針 → 崩潰
}
SqStack *OPTR 只是聲明指針變量,未指向有效 SqStack 結構體內存。S = malloc(...),外部指針不變;需傳遞 **指針的指針** 或 **引用**(C++)。
int main() {
SqStack OPTR, OPND; // 分配結構體對象
InitStack(&OPTR); // 傳遞地址
InitStack(&OPND);
}
int InitStack(SqStack *S) { // S 已指向有效內存
S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base) return 0;
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 1;
}
SqStack* CreateStack() {
SqStack *S = (SqStack*)malloc(sizeof(SqStack));
if (!S) return NULL;
S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base) { free(S); return NULL; }
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return S;
}
int main() {
SqStack *OPTR = CreateStack();
SqStack *OPND = CreateStack();
}
若 SElemType 含 char *str,malloc 只分配結構體本身,**不會自動為成員指針分配內存**。使用前必須單獨 malloc 並 strcpy,銷毀時先 free 成員再 free 結構體。
** 或返回新指針。