- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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
new_head_index
的值被 GDB 在所有 3 行上确认为 1。
GDB 在 A、B 和 C 行确认,当我执行 p *hello
(打印 hello
的内容)时,我得到:
(gdb) p *hello
$7 = {data = 888, next = 0x8414e70, someBool = false}
但是打印 array@2
的内容(数组的长度为 2,在 main 中声明为 Node *heads[numHeads] = {new Node{0, nullptr, false}, nullptr };
) 在 B 行和 C 行上有这个(在行实际执行之前):
(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]
。这可能是什么原因?
这是一个最小的可重现示例:主.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);
}
}
}
修改.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)
最佳答案
问题是 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,所以它不能 指向一个包含 4113
的 Node
。
我不相信有 GDB 内置语法来print *array[0 .. N]
。一种可能的解决方案是定义一个辅助函数(它可以很容易地泛化为将数组名称和大小作为参数,但为了简单起见,这里保持微不足道):
(gdb) def parray
Type commands for definition of "parray".
End with a line saying just "end".
>print *array[0]
>print *array[1]
>end
(gdb) parray
$4 = {data = 0, next = 0x0, someBool = false}
Cannot access memory at address 0x0
(gdb) c
Continuing.
Breakpoint 1, attach (array=0x7fffffffdb70, head=0, index=1, data=888) at foo.cc:34
34 array[new_head_index] = hello;
(gdb) n
35 }
(gdb) parray
$5 = {data = 777, next = 0x55555556ae70, someBool = false}
$6 = {data = 888, next = 0x55555556ae70, someBool = false}
关于c++ - 有什么理由不能将堆指针分配给数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680903/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!