-1

我正在维护和扩展诊断测试套件的功能,这段代码多次出现,我不确定它的作用:

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;

其中 i 是循环变量,而 reg 是指向 32 位 int 的指针(Number 是指向该 32 位 int 的地址)。这个特殊的测试会清除寄存器,但它是否意味着改变 ret?

编辑:我想我的问题有点模棱两可,我想知道具体是什么片段:

int ret = 0, i, *regs;

是否有效,或者为什么有效。

4

5 回答 5

1

是的,我认为你是对的。假设 Regs 是 Reg 对象的数组,那么它将每个 Reg.Number 指向的内容归零,然后返回 0。如果代码库遵循返回状态码的范式,在这种情况下为 0,这似乎是合理的做法通常意味着成功。

于 2012-07-10T18:59:49.793 回答
1

int ret = 0, i, *reg;

定义了三个变量:一个int被调用ret,一个int被调用i和一个int*被调用reg。只有ret被初始化(到0)。

原因是声明的语法(稍微简化)是:

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

这里的声明说明符是 just int,那么我们有一个由三个 init-declarator 组成的 init-declarator 列表。其中一个有初始化程序,另外两个没有。声明*reg器定义了一个“指向-whatever-type-the-declaration-specifiers-say 的指针”。有关血腥细节(以及我在上面语法中遗漏的部分),请参见标准中的 6.7“声明”。

于 2012-07-10T19:08:57.767 回答
0

不,ret永远为零。这个函数只是清除uint数组中结构指向的一些 s Regs

于 2012-07-10T18:57:09.453 回答
0

看起来总是返回 0。除非我只看到相关代码的一部分。

于 2012-07-10T19:00:01.353 回答
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 不一定是缓冲区/数组/流,就 Sizeof 而言它比 regs 大是必要的。

循环从forReg 内 Number 字段的位置开始在每次迭代中将 n 字节归零(假设Number是 32bits = 4 bytes long integer 从 byte 4 到 byte 7 inside Reg)。

(uint*) 转换在 C 中是正常的,因为在处理内存时,简单的 (uint) 可能不足以跨越整个可寻址堆。我很少发现 (int*) 强制转换来迭代堆。

最后,在没有任何失败之后(在这种情况下没有任何代码可以失败,因为甚至没有使用 ret),返回值是 0 = 正返回。

为了更好地解释 for 循环中所做的事情,假设 Regs 是一个结构,其中包含一行中的 4 个 Reg 实例(某种数组),每个 Reg 是 32 字节宽,第二个字段(从 4 到 7 的字节)被称为Number(例如 32 位整数字段)。在 for 循环运行之前和之后,内存的逐字节可视化(为便于使用和读取的 DECIMAL 格式)可以是:

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 §    
于 2012-07-10T20:10:49.633 回答