示例結構:
struct MyList {
struct myElem *head;
};
我是指標的新手。我已經得到了一些東西,但沒有得到以下內容。
這兩個選項有什么區別?
struct MyList *newEmptyList() {
struct MyList list;
list.head = NULL;
return &list;
}
struct MyList *newEmptyList() {
struct MyList *list;
list->head = NULL;
return list;
}
uj5u.com熱心網友回復:
兩者都是錯誤的:
在這里,您回傳指向區域變數的指標,但是一旦函式newEmptyList終止,list就不再存在:
struct MyList *newEmptyList() {
struct MyList list;
list.head = NULL;
return &list;
}
這是錯誤的,因為list(這是一個指標)沒有指向任何地方,因此您不能像這里那樣取消參考它:list->head = NULL;
struct MyList *newEmptyList() {
struct MyList *list;
list->head = NULL;
return list;
}
你可能想要這個:
struct MyList *newEmptyList() {
struct MyList *list = malloc(sizeof(*list));
list->head = NULL;
return list;
}
malloclist為您的指標分配記憶體。呼叫 后malloc,list指向一些有效記憶體。
uj5u.com熱心網友回復:
兩者都會導致未定義的行為:
struct MyList *newEmptyList() {
struct MyList list;
list.head = NULL;
return &list;
}
struct MyList *newEmptyList() {
struct MyList *list;
list->head = NULL;
return list;
}
在第一個中,您將回傳堆疊上的區域變數的地址。當函式回傳時,訪問先前在該堆疊上的值是未定義的行為。在取消參考回傳的指標之前,它不會導致未定義的行為。
在第二個中:
- 未分配給記憶體地址的指標使用起來很危險。導致未定義的行為
list->head取消參考list會立即導致未定義的行為,因為指標未指向可用的記憶體地址,并且您正在嘗試寫入該記憶體地址...
正確的方法是:
struct MyList *newEmptyList() {
struct MyList *list = malloc(sizeof(struct MyList));
list->head = NULL;
return list;
}
malloc() 在堆上分配記憶體并回傳分配記憶體開始的記憶體地址。
指標
C 中的指標基本上是保存其他變數地址的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419669.html
標籤:
