通过指针C++调用成员函数,对象为空



我有一个指向ListNode对象sum_ptr的指针,它指向sum。当我通过sum_ptr调用append方法时,我得到一个segfault。看着gdb,我看到了"这个";在对append的调用中为0x0,这没有意义。有人知道为什么sum对象在调用append方法时为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;
}

附加方法:

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;

默认构造函数似乎将数据成员next设置为nullptr,将数据成员val设置为值INT_MIN(这没有意义(。

然后,您第一次使用指针sum_ptr调用成员函数append

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

在这种情况下,成员函数append只是改变数据成员val

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

然后在while循环中重新分配指针

sum_ptr = sum_ptr->next;

因此现在指针sum_ptr具有等于nullptr的数据成员sum.next的值。您将在成员函数append的下一次调用中使用这个空指针,这将导致未定义的行为。

还要注意,例如这对语句

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

因为在执行第一语句之后CCD_ 18总是小于10。因此,变量c_over将始终设置为0。你至少需要交换一下这些声明。

最新更新