gpt4 book ai didi

c++ - 将地址分配给指向指针的指针会产生段错误

转载 作者:行者123 更新时间:2023-11-28 08:24:03 25 4
gpt4 key购买 nike

我有一个二叉搜索树类 BSTree。它曾经只有一个成员,即树的根节点。节点的类型由 BSTNode 结构定义。但后来我添加了另一个成员,一个指向用于比较两个元素的函数的指针。那就是问题开始的时候。

接口(interface):

template <typename T>
struct BSTNode {
public:
struct BSTNode<T> *left;
struct BSTNode<T> *right;
T key;
BSTNode<T>(T element){ key = element;}
};

template <typename T>
class BSTree {
private:
BSTNode<T> *root;
int (*compare)(T el1, T el2); // this is the new member
public:
BSTree<T>(int (*cmp)(T el1, T el2)) {root = NULL; compare = cmp;}
//...

向树添加内容的函数 BSTree::add 使用指向根节点的指针。在我添加新的“比较”成员后,此功能中断。该函数开始如下(我添加了一些 printf 行以查找崩溃的确切行):

函数定义:

template <typename T>
BSTNode<T>* BSTree<T>::add(T element) {
BSTNode<T> **node;
printf("&root = %p\n", &root);
printf("node = %p\n", node); //must be NULL
printf("compare = %p\n", (int(*)(T, T))compare); //address stored in fn pointer
node = &root; /////////// THIS PART produces the segmentation fault. ////////
printf("succeeded");
//...

函数调用(在主函数中):

BSTree<int> bst(&stdcomp); //stdcomp is the integer compare function
bst.add(6);
//...

输出:

&root = 0x7fff5fbff8c0
node = 0x0
compare = 0x100001325
Segmentation fault

令我特别困惑的是赋值失败了,即使它没有取消引用存储在我的指针“节点”中的地址,并且“节点”是一个局部变量并且没有被取消引用;我不知道非法内存访问发生在哪里。我试图将节点初始化为几个文字值(例如 NULL 或 0x1),但它们没有产生错误。它只是在我将函数指针添加到类之后才失败,根据打印的内容,它被分配了正确的地址。它与滥用模板有什么关系吗?

顺便说一下,BSTree 模板是用类型名称 int 和 const char* 实例化的,每个类型都有一个正确分配的不同比较函数(我认为)。我测试了他们的添加功能,但都产生了错误。

最佳答案

您的段错误可能发生在 printf("succeeded"); 调用之后,因为 printf 不包含换行符,并且您的输出可能处于行缓冲模式。所以字符串“成功”进入标准输出缓冲区但没有出现在屏幕上。要么将 stdout 置于无缓冲模式,要么在字符串中插入 \n。或者更好的是,在每个 printf 之后粘贴 fflush(stdout);,这样无论 stdout 缓冲模式如何,缓冲区都会被刷新。

关于c++ - 将地址分配给指向指针的指针会产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com