C:在一个数组中切换两个结构

C: switch two struct in one array

我必须在一个由数组组成的数据结构中切换两个元素(结构)。当我为数据结构创建一个新元素时,我会维护一个指向该元素的指针,以便稍后修改它。当我尝试更改值时,它似乎和以前一样。你能告诉我哪里错了吗?

struct TimeData {
    struct timeval time_send;
    struct timeval time_recv;
    struct timeval timeout;
    struct timeval time_stamp;
    int seq;
};

struct TimerWheel {
    struct CircularBuffer *cb;
};

struct TimeData *newTimeData(int seq, time_t sec, suseconds_t usec) {
    struct TimeData *td;

    td = malloc(sizeof(struct TimeData));

    td->seq = seq;
    td->timeout.tv_sec = sec;
    td->timeout.tv_usec = usec;

    gettimeofday(&td->time_send, NULL);

    return td;
}

int timerWheelAdd(struct TimerWheel *tw, struct TimeData *td) {
    if (circularBufferIsFull(tw->cb) == 1)
        return 1;
    else {
        circularBufferAdd(tw->cb, td);
        circularBufferShiftE(tw->cb);
        return 0;
    }
}

struct TimeData *timerWheelGetTmr(struct TimerWheel *tw) {
    if (circularBufferIsEmpty(tw->cb) == 1)
        return NULL;
    else {
        struct TimeData *td;
        td = circularBufferRead(tw->cb);
        circularBufferShiftS(tw->cb);
        return td;
    }
}

int main() {
    struct TimeData *td5;
    struct TimeData *td6;

    td5 = newTimeData(1, 3, 5000);
    td6 = newTimeData(2, 5, 6000);

    struct TimerWheel *tw1 = newTimerWheel(10);

    timerWheelAdd(tw1, td5);
    timerWheelAdd(tw1, td6);

    ///////NOW I TRY TO MODIFY td5
    td5->seq = 67;

    struct TimeData *temp;
    while ((temp = timerWheelGetTmr(tw1)) != NULL)
        printf("%d\n", temp->seq);
    //////td5->seq is the same as before
}

编辑

CircularBuffer 结构只是 (void *) 元素的通用循环缓冲区。这个数据结构工作正常。问题是这样的: 当我有一个指向该结构的指针时,为什么我不能更改该结构中的整数?

这是我的 CircularBuffer:

在你链接到的问题中,你有这个实现 circularBufferAdd:

void circularBufferAdd(struct CircularBuffer *cb, void* obj) {
    memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);
}

如您所知,此功能存在问题;那是 为什么你发布了另一个问题。但这是您接受的答案:

    memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType);

这里的共同主题是您正在复制结构的内容 obj 指向(不是指针 obj 本身) 分配给 cb->buffer.

的内存中的某处

从主函数中调用:

    timerWheelAdd(tw1, td5);

所以现在您在两个地方拥有相同数据的副本: td5 指向的一个地方,以及其中的一个地方 cb->buffer 指向的内存块。 (注意该函数调用中的临时变量 obj 也指向与td5相同的内存,但是那个指针跑出了 函数末尾的作用域。)

所以现在当您设置 td5->seq = 67; 时,它会修改 seq 字段 td5 指向的结构的副本。但是 td5 没有指向任何地方 在 cb->buffer 指向的内存块内, 所以当然 td5->seq 的修改不会修改任何东西 在 cb->buffer 中,当您打印出 cb->buffer 的内容时 当你调用 timerWheelAdd(tw1, td5); 时你会看到你放在那里的东西 而你没有看到你在复制后对td5所做的更改。

如果您还想修改 "contents" 使用您传递给 circularBufferAdd 的相同指针的循环缓冲区, 您可以自己复制指针(而不是它们指向的数据) 进入循环缓冲区。但这很有可能导致 你还有很多问题。如果你不这样做,你可能会过得更好 期望更改数据结构的一个副本会自动 更改您之前制作的其他副本。