我有这个简单的方法来移动数组中的元素。
void queuePut(uint32_t val, uint32_t *q, int qlen) {
for (int i=qlen; i>0; i--) {
q[i] = q[i-1];
}
q[0] = val;
}
在我的类标题中,我定义了一个struct
@interface MyClass : NSObject {
struct {
uint32_t cookie[10];
uint32_t value[10];
} queue;
}
我反复将元素放在两个队列前面
queuePut((uint32_t)cookie, myClassInstance->queue.cookie, cookieQueueLen);
queuePut((uint32_t)intValue, myClassInstance->queue.value, valueQueueLen);
当我这样做时,我的值队列布局如下:
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
当我删除第一行queuePut((uint32_t)cookie, ...
时,值队列显示了这个(我希望它是什么):
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
0.0.0.0.0.0.0.0.0.0.
1.0.0.0.0.0.0.0.0.0.
1.1.0.0.0.0.0.0.0.0.
0.1.1.0.0.0.0.0.0.0.
0.0.1.1.0.0.0.0.0.0.
0.0.0.1.1.0.0.0.0.0.
0.0.0.0.1.1.0.0.0.0.
0.0.0.0.0.1.1.0.0.0.
是什么导致这种情况?
此致 埃里克
答案 0 :(得分:4)
究竟什么是cookieQueueLen
和valueQueueLen
?
这是可疑的:
void queuePut(uint32_t val, uint32_t *q, int qlen) {
for (int i=qlen; i>0; i--) {
q[i] = q[i-1];
}
q[0] = val;
}
如果您为qlen
传递了10,那么在第一次迭代中,您将写入q[10]
,这超出了cookie
(或value
的范围数组。你正在挫败记忆。
因此,在这种情况下,您正在写cookie
数组的末尾并进入value
数组的开头。