2010-09-17 25 views
0

我已經這種簡單的方法在一個陣列到移位元件。這片C /的OBJ-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; 
} 

以我類的頭我定義一個結構

@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. 

是什麼原因造成的?

問候, 埃裏克

回答

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

如果你傳遞10 qlen,然後在你寫q[10]第一次迭代,這是過去的cookie(或value)陣列的邊界。你在破壞記憶。

因此,在這種情況下,你在寫過去cookie數組的結束,進入value陣列的開始。

+1

哦,我的上帝,我不敢相信我是多麼愚蠢。我坐了幾個小時,我沒有看到它!但有時你只需要另一個人指出明顯的;) – 2010-09-17 10:25:34