2012-07-10 15 views
-1

我在維護和擴展診斷測試套件的功能,而且這段代碼出現了多次,我不確定它會做什麼:不確定什麼int regs = 0,i,* regs表示

int ret = 0, i, *reg; 
int size = sizeof(Regs)/sizof(Reg); 
for(i = 0; i<size; i++) { 
    reg= (uint*)Regs[i].Number; 
    *reg=0; 
} 
return ret; 

其中我是循環變量,而reg是一個指向32位int(Number是該32位int的地址)的指針。這個特殊的測試會清除寄存器,但它是否意味着改變ret?

編輯:我想我的問題是有點曖昧,我特別想知道的片段:

int ret = 0, i, *regs; 

呢,爲什麼它是有效的。

+0

RET貌似只在那裏保持其價值的痕跡將被返回,以防萬一你想在它結束之前改變它 – 2012-07-10 18:59:28

+0

對'uint *'進行轉換,然後對'int *'進行賦值可能是一個錯誤 - 不確定它是否是複製錯誤或者原始代碼是狡猾。 – 2012-07-10 19:08:00

+0

我不是代碼的原始作者,但我相當肯定一個無符號的0和一個有符號的0應該有相同的表示。 – ardent 2012-07-10 19:12:03

回答

1

int ret = 0, i, *reg;

定義了三個變量:一個叫做retint,一個叫inti稱爲regint*。只有ret被初始化(至0)。

的原因是,對於一個聲明(略簡化)語法是:

declaration: 
    declaration-specifiers init-declarator-list[_opt_] 
init-declarator-list: 
    init-declarator 
    init-declarator-list , init-declarator 
init-declarator: 
    declarator 
    declarator = initializer 

這裏聲明,符只是int,那麼我們有由三個初始化聲明符一個init聲明符列表。其中一個有一個初始化程序,另外兩個沒有。聲明者*reg定義了「指向任何類型的聲明說明符說 - 」。請參閱標準中關於血腥細節的6.7「聲明」(以及上面語法中遺漏的位)。

0

否,ret將始終爲零。此功能僅清除Regs數組中結構指向的一些uint

1

是的,我認爲你是對的。假設Regs是一個Reg對象的數組,那麼它會將每個Reg.Number指向的內容清零,然後返回0.如果代碼庫遵循返回狀態代碼的範例(這種情況下爲0),這似乎是合理的做法通常意味着成功。

+0

嗯,那就是我的想法。那爲什麼int ret = 0,i,* regs; C中有效的行嗎?我仍然不確定這是如何工作的。 – ardent 2012-07-10 19:08:11

+1

@ardentsonata,'int'是行中所有東西的類型。 'ret'是一個初始化爲零的int,'i'是一個int,'* regs'是一個int - 它使得regs成爲一個int指針。合理? – 2012-07-10 19:16:09

+0

'int ret = 0,i,* regs;' 相當於 'int ret = 0; int i; int * regs;' – 2012-07-10 19:44:52

0

它看起來總是返回0.除非我只看到相關代碼的一部分。

0

我的個人觀點:

int ret = 0, i, *reg; 
int size = sizeof(Regs)/sizof(Reg); 
for(i = 0; i<size; i++) 
{ 
    reg= (uint*)Regs[i].Number; 
    *reg=0; 
} 
return ret; 

int ret = 0, i, *reg;相當於

int ret; 
ret = 0; //return value, if nothing changes it while running the sub, the return is (positive) as every C routine should do 
int i; // i is what it is, no initialisation is performed 
int* reg; //reg is what it is, no initialisation is performed. 

int size = sizeof(Regs)/sizof(Reg);size定義爲一個被叫Regs緩衝器和Reg類型的其基本數據字段之間的原子尺寸。用於迭代結構本身(注意:在C中,Regs不是緩衝器/數組/流,它只是需要它在尺寸上大於regs。

for循環正在歸零從Reg內部的Number字段位置開始,每個單獨迭代中有n字節(假設NumberReg內的32位= 4字節長整數,從字節4到字節7)。(uint *)強制轉換在C中是正常的,因爲在處理內存時,一個簡單的(uint)可能不足以跨越整個可尋址的堆。我很少發現(int *)強制重複遍歷整個堆。

最後,沒有任何失敗後(在這種情況下沒有什麼可以失敗的代碼,因爲ret甚至沒有使用)返回值爲0 =正返回。

爲了更好地解釋在for循環中做了什麼,假設Regs是一行中包含4個Reg狀態(某種數組)的結構,每個Reg的寬度是32個字節,第二個字段(從4到7)被稱爲Number(例如32位整數字段)。 前後的for循環的運行之後字節的內存字節可視化(十進制格式的易用性和閱讀)可能是:

before:  111910460 §  721672678 §  1941200806 § -1183627007 § 1586684153 § 1875498315 § 1260999030 § 1325944862 § 1065932391 § 1844134883 § 1605637187 § -1318663956 § 233262241 §  1220589880 § 1712611369 § -2095694326 § -1982972241 § 1536475566 § 1550414594 § 60661453 §  1920891323 § 1052971320 § 151058183 §  -693448823 § -763585993 § -1546059240 § -638901203 § 1592652624 § -26126893 §  359938920 §  730403663 §  -2119128428 § 22506289 §  329168535 §  1888110366 § -1324425487 § -2128177580 § -1447190387 § -2102707104 § -834692095 § 233601466 §  -2368015 §  -1247566469 § -496146592 § 1399945760 § -433672213 § -1874762262 § -240141582 § 1361991330 § -2100310671 § -1716316415 § 1113810979 § 837914061 §  -2004720198 § -499664162 § -581537344 § -1876582939 § -855186203 § -477447744 § 609476093 §  -1551962613 § 1342130125 § -1245085596 § 70042099 §  853203728 §  -1216264601 § -821207587 § -663767272 § 1811963624 § -1359626002 § 587239161 §  412800157 §  1308828835 § -484000995 § 1196157114 § 1554729984 § -588907472 § -862275327 § 2141670903 § -496863553 § -1461319540 § 2011880048 § 724185989 §  -523083707 § 535075127 §  -1252818631 § -1535682266 § 1731550626 § -1513281783 § 2056573089 § 542455754 §  -1663652432 § 209157746 §  -917714063 § -62336558 §  -335893804 § -455431912 § -1338920623 § 966843505 §  698158966 §  -1748732016 § -710422429 § 429351988 §  1404039358 § 1828069719 § -1849911876 § -1756314151 § 1046003361 § -1124626131 § 422202 §  608265685 §  1538084062 § -1342247255 § 1734342148 § -2095965518 § 544674987 §  -12582890 §  1365311130 § 1104188373 § 688131395 §  -1615783097 § 755406204 §  -151161805 § 1955152994 § -427907710 § 700996102 §  
after: 111910460 §  721672678 §  1941200806 § -1183627007 § 0 §    0 §    0 §    0 §    1065932391 § 1844134883 § 1605637187 § -1318663956 § 233262241 §  1220589880 § 1712611369 § -2095694326 § -1982972241 § 1536475566 § 1550414594 § 60661453 §  1920891323 § 1052971320 § 151058183 §  -693448823 § -763585993 § -1546059240 § -638901203 § 1592652624 § -26126893 §  359938920 §  730403663 §  -2119128428 § 22506289 §  329168535 §  1888110366 § -1324425487 § 0 §    0 §    0 §    0 §    233601466 §  -2368015 §  -1247566469 § -496146592 § 1399945760 § -433672213 § -1874762262 § -240141582 § 1361991330 § -2100310671 § -1716316415 § 1113810979 § 837914061 §  -2004720198 § -499664162 § -581537344 § -1876582939 § -855186203 § -477447744 § 609476093 §  -1551962613 § 1342130125 § -1245085596 § 70042099 §  853203728 §  -1216264601 § -821207587 § -663767272 § 0 §    0 §    0 §    0 §    1308828835 § -484000995 § 1196157114 § 1554729984 § -588907472 § -862275327 § 2141670903 § -496863553 § -1461319540 § 2011880048 § 724185989 §  -523083707 § 535075127 §  -1252818631 § -1535682266 § 1731550626 § -1513281783 § 2056573089 § 542455754 §  -1663652432 § 209157746 §  -917714063 § -62336558 §  -335893804 § -455431912 § -1338920623 § 966843505 §  698158966 §  0 §    0 §    0 §    0 §    1828069719 § -1849911876 § -1756314151 § 1046003361 § -1124626131 § 422202 §  608265685 §  1538084062 § -1342247255 § 1734342148 § -2095965518 § 544674987 §  -12582890 §  1365311130 § 1104188373 § 688131395 §  -1615783097 § 755406204 §  -151161805 § 1955152994 § -427907710 § 700996102 §  
相關問題