请考虑以下代码:
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关键字不应该使指针成为常量.有任何想法吗?
我有一个动态数据结构,如下所示:
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 的原因)。然后它陷入无限循环,因为它不打印“节点已删除”。
如何正确释放内存?这与我的节点构建方式有关吗?
假设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.