Node的结构如下:
struct Node {
int data;
Node *next;
bool someBool;
};
我有以下几行:
Node *hello = new Node{data, cur, !new_head}; // line A
array[new_head_index] = hello; // line B
} // line C
GDB在所有3行中确认new_head_index
的值为1。
GDB在A,B和C行确认p *hello
(打印hello
的内容)时,我得到:
(gdb) p *hello
$7 = {data = 888, next = 0x8414e70, someBool = false}
但是在行B和C(实际执行行之前)上打印array@2
(数组的长度为2,在main中声明为Node *heads[numHeads] = {new Node{0, nullptr, false}, nullptr};
的内容)的内容如下:
(gdb) p **array@2
$8 = {{data = 777, next = 0x8414e70, someBool = true}, {data = 33, next = 0x378, someBool = 112}}
(应该是777节点,我之前已经填写了它。)
在A行上,它具有:
(gdb) p **array@2
$9 = {{data = 777, next = 0x8414e70, someBool = true}, {data = 61265, next = 0x0, someBool = false}}
基本上,hello
没有分配给array[1]
。可能是什么原因?
这是一个最小的可重现示例: main.cc
#include <iostream>
#include <string>
#include "new_mod.h"
using namespace std;
int len(Node **array) {
int i = 0, count = 0;
while (array[i++]) { ++count; }
return count;
}
void attach(Node **array, int head, int index, int data) {
Node *hello = new Node{data, cur};
array[new_head_index] = hello;
}
int main() {
string command;
int head;
Node *array[numHeads] = {new Node{0, nullptr}, nullptr};
while (cin >> command) {
if (command == "a") {
int m, x;
cin >> head >> m >> x;
attach(array, head, m, x);
}
}
}
mod.h
#ifndef MOD_H
#define MOD_H
#include <ostream>
struct Node {
int data;
Node *next;
bool someBool = false;
};
const int numHeads = 2;
void attach(Node **array, int head, int index, int data);
#endif
尝试输入此内容(我已将此文件命名为a.in
)
a 0 0 777
a 0 1 888
使用g++ -Wall -g main.cc -o newe
进行编译,因此您可以使用gdb进行操作!
顺便说一下,这是我在gdb中为解决上述问题所做的事情:
gdb newe
b attach(Node**, int, int, int)
run <a.in
layout n
c
n
n
n
n
n
n
n (comment: I did n until line Node *hello = new Node{data, cur};)
p **array@2
n
n
p **array@2 (the problem is shown)
答案 0 :(得分:0)
问题是Node *array[2]
和Node **array
不是是同一件事,当您要求GDB p **array@2
时,您要求将数组解释为如果array
是双指针,而不是数组。
您可以在开始输入循环之前观察到这一点:
(gdb) p *array@2
$1 = {0x55555556ae70, 0x0}
(gdb) p *array[0]
$2 = {data = 0, next = 0x0, someBool = false}
在这里,您可以看到array
处于预期状态:第一个节点全为零,第二个节点为NULL。
但是当您这样做时:
(gdb) p **array@2
$3 = {{data = 0, next = 0x0, someBool = false}, {data = 4113, next = 0x3737203020302061, someBool = 55}}
您会立即发现您没有在查看正确的数据:您知道 array[1]
为NULL,因此不能指向其中有Node
的{{1}}。
我不认为4113
有GDB内置语法。
一种可能的解决方案是定义一个辅助函数(可以很容易地将其泛化为数组名称和大小作为参数,但是为了简单起见,这里将其保持平凡):
print *array[0 .. N]