C 有没有办法警告这个指针错误?
情况是我有一个C 有没有办法警告这个指针错误?,c,C,情况是我有一个struct tree_t tree[MAXTREES]; 我一直在使用指针访问数组的元素 for(int i = 0; i < MAXTREES; i++) { tree_t *tptr = tree + i; // ... } 情况就是这样,但我打字时出错了 num = tree->node[j].left; 由于数组衰减为指向其第一个元素的指针,它是有效的C代码,我花了一些时间才发现我做错了什么 有没有办法得到有关这方面的警告?还是仅仅是糟糕
struct
tree_t tree[MAXTREES];
我一直在使用指针访问数组的元素
for(int i = 0; i < MAXTREES; i++) {
tree_t *tptr = tree + i;
// ...
}
情况就是这样,但我打字时出错了
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
}
}
}
简化
tptr->spudics = tptr->node[tptr->root].left + tptr->node[tptr->root].right;
哪个国际海事组织更具可读性。这是一个可以避免的问题。如果将其重写为使用迭代器指针,则会得到如下代码:
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;
}
}
}
int main(无效)
{
tree_t*tptr=树;
对于(int i=0;inode;
对于(int j=0;jleft;
}
}
}
这避免了很多问题,因为您使用的是非常集中的指针,实际上没有理由做像
leaf[j]这样的事情。正确的代码看起来很简单。不正确的代码看起来已损坏。使用-Wall
编译是否会给您任何警告?@tadman这是msvc打开更多警告,然后。@tadman所以gcc会使用-Wall
发出警告?我很快会发布MRE。谢谢您的帮助,但它没有回答问题。为了示例,我简化了实际代码。我正在使用指向结构的指针来避免将数组索引嵌套在此处:tree[index].spudics=tree[index].node[tree[index].root]。left+tree[index].node[tree[index].root]。right编码>并使用tptr->spudics=tptr->node[tptr->root]进行简化。左+tptr->node[tptr->root]。右代码>哪个IMO使代码更容易遵循。我强烈反对。这是一条很难遵循的路。这样的树通常使用指针而不是数字索引,这是有原因的。这使实现更简单。谢谢,但我确实使用了指针,而不是问题中添加的嵌套数组索引。我为误导您道歉。示例代码纯粹是一个示例,用于查看某人的gcc是否产生了警告。正如我所暗示的,它不是功能代码。我举了一个简单的例子,每个人都说“但你不会那样做。”我没有这样做:真正的代码是以“编辑”的形式给出的。是的,我可以在添加的更复杂的代码中为两个节点
访问创建一个指针,但最初的错误是相同的。我是说,如果确实需要使用原始结构,那么就编写代码,这样更难意外地出错。编译器不能也不会报告代码在语法上有效,但执行与您的意图相矛盾的操作的情况。作为一名C程序员,这是你的隐式责任,要正确。换句话说:让正确的方式变得干净,让错误的方式变得丑陋。您将更快地发现错误。
tptr->spudics = tptr->node[tptr->root].left + tptr->node[tptr->root].right;
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;
}
}
}