簡體   English   中英

復制指針時出現段故障

[英]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*));

看來已經擺脫了編譯錯誤,您已將類型轉換paddresspaddress返回paddress addressListHead是一個指針,這意味着它可以保存對象的地址,但不能保存指針的地址。 malloc here語句不會創建對象。 您需要更改此-

addressListHead = (paddress)malloc(sizeof(paddress*));

addressListHead = (paddress)malloc(sizeof(struct address));

mainaddAddressToList函數中。

分段故障 :

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM