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

标签 c arrays pointers struct circular-buffer

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

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 * ) 元素的通用循环缓冲区。这个数据结构工作得很好。问题是这样的: 当我有指向该结构的指针时,为什么我无法更改该结构中的整数?

这是我的 CircularBuffwer: C : Insert/get element in/from void array

最佳答案

在您链接到的问题中,您有这样的实现 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 所做的更改复制后。

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

关于C:在一个数组中切换两个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843576/

相关文章:

c - 如何解释没有定义的结构?

c - 无需按 Enter 键即可读取键盘输入

mysql - 如何使用准备好的语句防止 C 语言中的 SQL 注入(inject)?

c++ - 为什么我们在解析器文件中定义 union 时使用复杂类的指针?

c - 动态分配结构体指针数组,指向它们并对它们进行排序

c++ - 从标准输入捕获字符,无需等待按下 Enter 键

java - 如何在java中添加字符串和int的循环

java - 代码在应该打印最大值和最小值时打印出数组的最大下标

javascript - json 对象与对象数组

c - 动态数组 C 上的无效赋值