2016-12-13 15 views
2

我目前有一個問題,關於我的C代碼有關RAM寫入似乎發生(我通過觀察通過gdb的結構成員檢查),即使我沒有主動打算寫該地區。作爲跟隨寫入RAM區域我沒有解決

我的結構聲明:提供

typedef struct tcb { 
    unsigned int tid; 
    thread_state_t state; 
    pthread_t thread; 
    sem_t sema; 
    unsigned long interval; 
    unsigned long rtime; 
} tcb_t ; 

typedef struct node { 
    tcb_t *tcb; 
} node; 

typedef struct entry entry; 

typedef struct entry { 
    entry *next; 
    entry *prev; 
    node node; 
} entry; 

這些定義,我不能改變它們。 我現在初始化的entry陣列與此代碼:

entry = malloc((num_threads) * sizeof(entry)); 

for (i = 0; i < num_threads; i++) 
{ 
    entry[i].next = NULL; 
    entry[i].prev = NULL; 
    entry[i].node.tcb = malloc(sizeof(tcb_t)); 
    entry[i].node.tcb->tid = i; 
    entry[i].node.tcb->state = THREAD_RUNNABLE; //initialize value to show the scheduler this thread works for the first time 
    entry[i].node.tcb->interval = interval; 

} 

其它字段不意味着在這一點上初始化。然而,一旦我運行我的代碼,讓我們說num_threads = 6entry[0].node.tcb->tid的值失去了它的值0,但持有一些奇怪的東西(看起來像一個指向我)。

當在gdb中爲該字段設置監視點時,它在線entry[i].node.tcb = malloc(sizeof(tcb_t));處通知我,我的值被覆蓋(此時i保持值2)。爲什麼是這樣?

+0

gdb觀察點在行'entry [i] .node.tcb = malloc(sizeof(tcb_t));'__with_what_of_' i'通知你? – CiaPan

+0

'valgrind'可以幫助你 –

+0

I1的價值得到通知,在爲I = 2,我後下gdb的輸出(可能會顯得凌亂,對不起那個) 255項[I] .node.tcb =的malloc(的sizeof(tcb_t)); (GDB)N 硬件監視點2:項[0] .node.tcb-> TID 舊值= 0 新值= 6299888 在aufgabe_5.c主(的argc = 3,argv的= 0x7fffffffe688):256 256條目[i] .node.tcb-> tid = i; (gdb)print i $ 1 = 2 – PfannkuchenXD

回答

4

你不能有行

entry = malloc((num_threads) * sizeof(entry)); 

書面 - 它不編譯。因爲你的程序有這樣的詩句爲

entry[i].next = NULL; 

我猜它實際上是

entry *entry = malloc((num_threads) * sizeof(entry)); 

所以,現在是什麼sizeof(entry)?我的小測試程序告訴我它是4,指針的大小,而不是結構。

所以請使用唯一的標識符。

+1

那麼,這裏的規範'sizeof'應該是'sizeof(* entry)'(取消加載變量,通過讓變量的類型只在聲明中引用,而不是在分配中獲得很好的DRY行爲),它應該得到正確的大小。這就是說,是的,重用類型名稱作爲變量名是一個壞主意。 – ShadowRanger

+0

謝謝。我在做家庭作業方面做得很好,我們總是收到他們希望我們填寫的代碼「框架」。這個代碼「框架」包括'entry * entry'行。它現在可以工作,我更改了變量名稱。 – PfannkuchenXD

+0

上面的評論是一個很好的評論:如果你使用了'sizeof * entry',那麼重複的名字就不重要了。這個錯誤(獲得指針的大小)是一個古老的栗子。另外:'sizeof'在引用* type *時只需要括號,但在引用變量時不需要。 –