[英]Seg Fault when copying a pointer
以下代碼如何導致段錯誤? 基本上,我將頭指針復制到temp之后,頭指針就消失了。
typedef struct address * paddress; // defines struct pointer
void addAddressToList(paddress head, int addr[])
{
if (head == NULL) {
//head->addrArray = addr; // if list is initially empty
} else {
paddress temp;
temp = head;
while (temp->right != NULL) {
temp = temp->right; // go to end of the list
}
paddress newAddress = (paddress)malloc(sizeof(paddress*));
newAddress->intAddr = addr;
newAddress->right = NULL;
newAddress->left = temp; // connect the new address
temp->right = newAddress;
}
}
main() {
paddress addressListHead;
addressListHead = (paddress)malloc(sizeof(paddress*));
int intAddr1[] = {1,2,3,4,5,6,7};
char hexAddr1[] = "123456";
int intAddr2[] = {16,14,13,12,11};
char hexAddr2[] = "fedcb";
addressListHead->intAddr = intAddr1;
addressListHead->hexAddr = hexAddr1;
addAddressToList(addressListHead, intAddr2);
}
paddress addressListHead;
addressListHead = (paddress)malloc(sizeof(paddress*));
看來已經擺脫了編譯錯誤,您已將類型轉換paddress
給paddress
返回paddress
。 addressListHead
是一個指針,這意味着它可以保存對象的地址,但不能保存指針的地址。 malloc here語句不會創建對象。 您需要更改此-
addressListHead = (paddress)malloc(sizeof(paddress*));
至
addressListHead = (paddress)malloc(sizeof(struct address));
在main
和addAddressToList
函數中。
分段故障 :
else {
paddress temp;
temp = head;
while (temp->right != NULL) {
temp = temp->right; // go to end of the list
}
我了解paddress::right
是一個指針,實際上您正在將其與NULL進行比較。 但是temp::right
初始化為。 它指向某個垃圾地址,因此您不能要求它與NULL比較。 使其指向有效的內存位置。
在main()中,您想要
addressListHead = (paddress)malloc(sizeof(address));
這樣可以確保獲得足夠的字節來保存地址。
您的代碼中存在多個問題。
首先,通常的建議是:停止將sizeof
與類型名稱一起使用(盡可能)。 將sizeof
與表達式一起使用,而不是類型。 類型名稱屬於聲明,無其他地方。
如果使用此malloc
慣用語,則可以避免內存分配問題
T *p = malloc(n * sizeof *p);
也就是說, sizeof
應該應用於*p
,其中p
是要分配的數組的指針, n
是該數組中元素的總數。 這樣,您不必猜測應該在sizeof
下指定什么類型名稱(這樣,您的代碼就變得與類型無關)。
在您的情況下,您只分配了一個對象,因此代碼應如下所示:
paddress newAddress = malloc(sizeof *newAddress);
(並且不要轉換malloc
的結果-這樣做絕對沒有意義)。
其次,當您使用列表的head元素時,您需要初始化所有字段。 但是,您永遠不會在head元素中right
(或left
)初始化。 因此,即使分配了正確的內存量也會導致崩潰。
第一個錯誤:
addressListHead = (paddress)malloc(sizeof(paddress*));
paddress *表示指向paddress的指針,其本身是指向結構地址的指針。 因此,paddress *是指向結構地址的指針。 您想做:
addressListHead = (paddress)malloc(sizeof(struct address));
另外,我看到您昨天犯了類似的錯誤。 為什么會出現段錯誤? 我想將一個char數組指針放入一個struct中
正確理解指針的概念很重要。 我絕對建議您閱讀一些有關指針的教程。 如果您需要幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.