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
的相同指针的循环缓冲区,
您可以自己复制指针(而不是它们指向的数据)
进入循环缓冲区。但这很有可能导致
你还有很多问题。如果你不这样做,你可能会过得更好
期望更改数据结构的一个副本会自动
更改您之前制作的其他副本。
我必须在一个由数组组成的数据结构中切换两个元素(结构)。当我为数据结构创建一个新元素时,我会维护一个指向该元素的指针,以便稍后修改它。当我尝试更改值时,它似乎和以前一样。你能告诉我哪里错了吗?
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
的相同指针的循环缓冲区,
您可以自己复制指针(而不是它们指向的数据)
进入循环缓冲区。但这很有可能导致
你还有很多问题。如果你不这样做,你可能会过得更好
期望更改数据结构的一个副本会自动
更改您之前制作的其他副本。