我的個人觀點:
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字節(假設Number
是Reg
內的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 §
RET貌似只在那裏保持其價值的痕跡將被返回,以防萬一你想在它結束之前改變它 – 2012-07-10 18:59:28
對'uint *'進行轉換,然後對'int *'進行賦值可能是一個錯誤 - 不確定它是否是複製錯誤或者原始代碼是狡猾。 – 2012-07-10 19:08:00
我不是代碼的原始作者,但我相當肯定一個無符號的0和一個有符號的0應該有相同的表示。 – ardent 2012-07-10 19:12:03