Этот кусок кода C / Obj-C озадачивает меня - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть этот простой метод для перемещения элемента в массиве.

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;
}

В моем заголовке класса я определил структуру

@interface MyClass : NSObject {
    struct {
        uint32_t cookie[10];
        uint32_t value[10];
    } queue;
}

Я неоднократно помещал элементы передqueues

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 Ответ

4 голосов
/ 17 сентября 2010

Что такое 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;
}

Если вы передаете 10 для qlen, то на первой итерации вы пишете в q[10], что выходит за границы cookie (или value) массивов. Ты забиваешь память.

Таким образом, в этом случае вы пишете после конца массива cookie и в начале массива value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...