情况是我有一个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
}
}
}
这是可以避免的问题。如果将其重写为使用迭代器指针,则将获得如下代码:
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
之类的事情。正确的代码看起来很简单。错误代码looks损坏。
您可以做的是使tree
成为指向tree_t
的指针的数组。然后需要通过动态分配其元素来初始化一次数组。
我叫数组trees
:
tree_t* trees[MAXTREES];