是否有警告此指针错误的方法?

问题描述 投票:1回答:2

情况是我有一个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
        }
    }
}
c
2个回答
2
投票

这是可以避免的问题。如果将其重写为使用迭代器指针,则将获得如下代码:

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损坏。


0
投票

您可以做的是使tree成为指向tree_t的指针的数组。然后需要通过动态分配其元素来初始化一次数组。

我叫数组trees

tree_t* trees[MAXTREES];
© www.soinside.com 2019 - 2024. All rights reserved.