簡體   English   中英

通過指針 C++ 調用成員 function,object 是 Z37A6259CC0C1DAE0BD9A7866489DFF

[英]Calling member function via pointer C++, object is null?

我有一個指向 ListNode object sum_ptr的指針,它指向sum 當我通過sum_ptr調用append方法時,我得到一個段錯誤。 查看 gdb,我看到“this”在對 append 的調用中是 0x0,這沒有任何意義。 有誰知道為什么在調用 append 方法時sum object 將是 null ? 謝謝!

  ListNode sum;
  ListNode* sum_ptr = ∑
  
  const ListNode* l1_ptr = &l1;
  const ListNode* l2_ptr = &l2;

  int c_over = 0;
  while(l1_ptr != nullptr && l2_ptr != nullptr){
    int temp_sum = l1_ptr->val + l2_ptr->val + c_over;
    temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
    c_over = temp_sum >= 10 ? 1 : 0;

    sum_ptr->append(temp_sum);
    sum_ptr = sum_ptr->next;
    
    l1_ptr = l1_ptr->next;
    l2_ptr = l2_ptr->next;
  }

Append 方法:

void ListNode::append(int v){
  if(this->val == INT_MIN){
    this->val = v;
  }
  else{
    ListNode *e = new ListNode();
    e->val = v; 
    ListNode* n = this;
    while(n->next != nullptr){
      n = n->next;
    }
    n->next = e;
  }
}

問題的原因如下。

您使用默認構造函數聲明了一個節點。

ListNode sum;

似乎默認構造函數將數據成員設置為nullptr並將數據成員val INT_MIN next這沒有意義)。

然后,您第一次使用指針sum_ptr append

ListNode* sum_ptr = ∑
//...
sum_ptr->append(temp_sum); 

在這種情況下,成員 function append只是更改數據成員val

void ListNode::append(int v){
  if(this->val == INT_MIN){
    this->val = v;
  }
  //...

然后你在 while 循環中重新分配指針

sum_ptr = sum_ptr->next;

所以現在指針sum_ptr的數據成員sum.next的值等於nullptr 並且您在下一次調用成員 function append時使用此 null 指針會導致未定義的行為。

還要注意例如這對語句

temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
c_over = temp_sum >= 10 ? 1 : 0;

沒有意義,因為在執行第一條語句后temp_sum總是小於 10。所以變量c_over總是會設置為 0。你至少需要交換這些語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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