这段C / Obj-C代码让我很困惑

时间:2010-09-17 10:09:51

标签: objective-c c

我有这个简单的方法来移动数组中的元素。

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.

是什么导致这种情况?

此致 埃里克

1 个答案:

答案 0 :(得分:4)

究竟什么是cookieQueueLenvalueQueueLen

这是可疑的:

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数组的开头。