相关疑难解决方法(0)

typedef指针const古怪

请考虑以下代码:

typedef struct Person* PersonRef;
struct Person {
  int age;
};

const PersonRef person = NULL;

void changePerson(PersonRef newPerson) {
  person = newPerson;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,编译器抱怨只读值不可分配.但是const关键字不应该使指针成为常量.有任何想法吗?

c typedef const

22
推荐指数
3
解决办法
1万
查看次数

如何正确地从内存中释放结构

我有一个动态数据结构,如下所示:

struct tree_node {
    int y;
    int x;
    struct tree_node *left;
    struct tree_node *right;
    struct tree_node *parent;
};
Run Code Online (Sandbox Code Playgroud)

该结构是二叉树的一个节点,此外每个节点还指向其父节点。现在,使用 I 向二叉树添加节点的经典方法malloc()可以轻松填充二叉树。但是,我在从内存中释放二叉树时遇到问题。

通常,要从二叉树中删除节点,您需要执行后序遍历,然后释放每个节点,如下所示:

void deleteTree(struct tree_node* node)
{
    if (node == NULL) return;

    deleteTree(node->left);
    deleteTree(node->right);

    printf("Deleting node with values [%d][%d]\n", node->y , node-> x);

    free(node -> left);
    free(node -> right);
    free(node -> parent);
    free(node);
    printf("\nNode deleted");
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行上述函数时,它不会从内存中释放二叉树。当我运行该函数时,它会释放一个叶子,然后当它尝试删除下一个节点时,它会陷入无限循环,我的计算机要么崩溃,要么程序因非描述性错误退出。

终端中的输出如下:

Deleting node with values [11][4]
Node deleted
Deleting node with values [7739840][0]
Run Code Online (Sandbox Code Playgroud)

因此,终端显示它删除了第一个叶子节点,然后尝试从下一个节点获取值,但无法获取(这就是它显示 7739840 的原因)。然后它陷入无限循环,因为它不打印“节点已删除”。

如何正确释放内存?这与我的节点构建方式有关吗?

c malloc binary-tree

2
推荐指数
2
解决办法
117
查看次数

当类型定义为结构体指针时,是否可以将 var 定义为指向 const 的指针?

假设test_t定义如下:

typedef struct test_t { 
    void *unused; 
} *(test_t)
Run Code Online (Sandbox Code Playgroud)

是否可以将变量定义为指向 const 的指针而不修改 的定义test_t

const test_t var将是一个指向 的 const 指针struct test_t,对吧?

我遇到这个问题,因为 sonarqube 建议“使该变量的类型成为指向 const 的指针”,但我无法更改定义,因为它在许多其他地方使用,其中变量应该是指向struct test_t.

c pointers typedef constants declaration

1
推荐指数
1
解决办法
105
查看次数

标签 统计

c ×3

typedef ×2

binary-tree ×1

const ×1

constants ×1

declaration ×1

malloc ×1

pointers ×1