通过指针C++调用成员函数,对象为空?
Calling member function via pointer C++, object is null?
我有一个指向 ListNode 对象 sum_ptr
的指针,它指向 sum
。当我通过 sum_ptr
调用 append
方法时,出现段错误。查看 gdb,我看到“this”在追加调用中是 0x0,这是没有意义的。有谁知道为什么 sum
对象在调用 append 方法时为空?谢谢!
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
(这没有意义).
那你是第一次调用成员函数append
使用指针sum_ptr
.
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
的数据成员 sum.next
的值等于 nullptr
。并且您在成员函数 append
的下一次调用中使用了此空指针,这会导致未定义的行为。
还要注意例如这对语句
temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
c_over = temp_sum >= 10 ? 1 : 0;
没有意义,因为在执行第一条语句后 temp_sum
总是小于 10。所以变量 c_over
总是会被设置为 0。你至少需要交换这些声明。
我有一个指向 ListNode 对象 sum_ptr
的指针,它指向 sum
。当我通过 sum_ptr
调用 append
方法时,出现段错误。查看 gdb,我看到“this”在追加调用中是 0x0,这是没有意义的。有谁知道为什么 sum
对象在调用 append 方法时为空?谢谢!
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
(这没有意义).
那你是第一次调用成员函数append
使用指针sum_ptr
.
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
的数据成员 sum.next
的值等于 nullptr
。并且您在成员函数 append
的下一次调用中使用了此空指针,这会导致未定义的行为。
还要注意例如这对语句
temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
c_over = temp_sum >= 10 ? 1 : 0;
没有意义,因为在执行第一条语句后 temp_sum
总是小于 10。所以变量 c_over
总是会被设置为 0。你至少需要交换这些声明。