代码之家  ›  专栏  ›  技术社区  ›  kernel

打印结构数组内容时出错

  •  1
  • kernel  · 技术社区  · 2 年前

    以下代码在数组的第一个元素之后未打印。打印第一个结构内容后,后续值包含垃圾值

    #include <iostream>
    
    using namespace std;
    
    #define SMALL_STRING_LEN 20
    #define TINY_STRING_LEN 10
    
    enum data_item_type_t {
        TYPE_FLOAT,
        TYPE_INT,
        TYPE_UINT
    };
    
    enum agent_type_t {
        LOCATION,
    };
    
    enum sensor_type_t {
        NOT_APPLICABLE,
    };
    
    typedef struct data_holder_conf {
        int16_t data_id;
        char description[SMALL_STRING_LEN];
        int16_t num_items;
        char unit[TINY_STRING_LEN];
        data_item_type_t data_type;
        agent_type_t agent;
        sensor_type_t sensor;
        /* pull frequency in milliseconds*/
        uint32_t pull_freq;
    } data_holder_conf_t;
    
    data_holder_conf_t data_holder_conf_arr[] = {
        { 101, "altitude",  1, "metres", TYPE_FLOAT, LOCATION, NOT_APPLICABLE, 100 },
        { 102, "latitude",  1, "metres", TYPE_FLOAT, LOCATION, NOT_APPLICABLE, 100 },
        { 103, "longitude", 1, "metres", TYPE_FLOAT, LOCATION, NOT_APPLICABLE, 100 },
        { 104, "velocity",  1, "kmph",   TYPE_FLOAT, LOCATION, NOT_APPLICABLE, 100 }
    };
    
    int main() {
        data_holder_conf_t *ptrLocal = (data_holder_conf_t *)malloc(4 * sizeof(data_holder_conf_t));
        memcpy(ptrLocal, data_holder_conf_arr, 4 * sizeof(data_holder_conf_t));
        cout << "..........................................\n";
        data_holder_conf_t *ptrTemp;
        for (int i = 0; i < 4; i++) {
            ptrTemp = (i * sizeof(data_holder_conf_t)) + ptrLocal;
            cout << " data_id = " << ptrTemp->data_id << endl;
            cout << " description = " << ptrTemp->description << endl;
            cout << " num_items = " << ptrTemp->num_items << endl;
            cout << " unit = " << ptrTemp->unit << endl;
            cout << " data_type =" << ptrTemp->data_type << endl;
            cout << " agent = " << ptrTemp->agent << endl;
            cout << " sensor = " << ptrTemp->sensor << endl;
            cout << " pull_freq = " << ptrTemp->pull_freq << endl;
        }
        free(ptrLocal);
    }
    

    我认为在计算 ptrTemp 价值

    但我无法找出错误所在。

    2 回复  |  直到 2 年前
        1
  •  1
  •   John Bollinger    2 年前

    问题在于:

    ptrTemp = (i * sizeof(data_holder_conf_t)) + ptrLocal;
    

    在C和C++中,指针算法都以指向类型的单位进行操作,但该代码似乎假设它以字节为单位进行操作。什么时候 i 是0,这无关紧要,但对于 您(以某种方式)超出了数组的边界。正确的答案是

    ptrTemp = i + ptrLocal;
    

    或者,它将是惯用的,更清楚地避免 ptrTemp 完全使用索引运算符 [] 在…上 ptrLocal 要访问元素,请执行以下操作:

            cout << " data_id = " << ptrLocal[i].data_id << endl;
            // ...
    
        2
  •  0
  •   chqrlie    2 年前

    我认为在计算 ptrTemp 价值

    假设正确:指针算法不正确:获取指向 i -第个条目,只需使用:

        ptrTemp = ptrLocal + i;
    

        ptrTemp = &ptrLocal[i];