gpt4 book ai didi

c - 有没有办法警告这个指针错误?

转载 作者:行者123 更新时间:2023-12-03 23:10:27 25 4
gpt4 key购买 nike

情况是我有一个数组 struct

tree_t tree[MAXTREES];

我一直在使用指针来访问数组的元素
for(int i = 0; i < MAXTREES; i++) {
tree_t *tptr = tree + i;
// ...
}

为了使代码更易于管理 - 比较这些简单的示例:
int num;
num = tree[i].node[j].left; // could be like this
num = tptr->node[j].left; // but I am using this

就是这种情况,但我错误地输入了一个错误
num = tree->node[j].left;

并且因为数组衰减到指向它的第一个元素的指针,它是有效的 C 代码,我花了一段时间才发现我做错了什么。

有没有办法得到关于这个的警告?或者只是糟糕的编程风格?

这是一个可编译的示例,实际上不值得运行。
#include <stdint.h>

#define MAXLEAFS 16384
#define MAXTREES 15262

typedef struct {
int16_t left;
int16_t right;
} leaf_t;

typedef struct tree_t {
leaf_t node[MAXLEAFS];
int spudbase;
int root;
int width;
int spudics;
struct tree_t *nextree;
} tree_t;

tree_t tree[MAXTREES];

int main(void)
{
for(int i = 0; i < MAXTREES; i++) {
tree_t *tptr = tree + i;
for (int j = 0; j < MAXLEAFS; j++) {
int num;
num = tree[i].node[j].left; // could be like this
num = tptr->node[j].left; // but I am using this
num = tree->node[j].left; // this is my bug
}
}
}

编辑:为了说明我为什么要这样做,这里是我的实际代码片段,我将其简化以提出问题。我正在使用指向 struct 的指针避免在此处嵌套数组索引:
tree[index].spudics = tree[index].node[tree[index].root].left + 
tree[index].node[tree[index].root].right;

并简化为
tptr->spudics = tptr->node[tptr->root].left + tptr->node[tptr->root].right;

哪个 IMO 更具可读性。

最佳答案

这是一个可以避免的问题。如果你重写它以使用迭代器指针,你会得到这样的代码:

int main(void)
{
tree_t *tptr = tree;

for (int i = 0; i < MAXTREES; ++i, ++tptr) {
leaf_t *leaf = tptr->node;

for (int j = 0; j < MAXLEAFS; ++j, ++leaf) {
int num = leaf->left;
}
}
}

这避免了很多问题,因为您使用的是非常集中的指针,而且真的没有理由做 leaf[j].left 之类的事情。意外地。正确的代码看起来很简单。不正确的代码看起来已损坏。

关于c - 有没有办法警告这个指针错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60010338/

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