Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法警告这个指针错误?_C - Fatal编程技术网

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;
        }
    }
}