我正在维护和扩展诊断测试套件的功能,这段代码会出现多次,我不确定它的作用:
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;
是,或为什么它有效。
答案 0 :(得分:1)
是的,我认为你是对的。假设Regs是Reg对象的数组,那么它将每个Reg.Number指向的内容归零,然后返回0.如果代码库遵循返回状态代码的范例,这似乎是合理的事情,在这种情况下0通常意味着成功。
答案 1 :(得分:1)
int ret = 0, i, *reg;
定义了三个变量:名为int
的{{1}},名为ret
的{{1}}和名为int
的{{1}}。仅初始化i
(int*
)。
原因是声明的语法(稍微简化)是:
reg
这里声明说明符只是ret
,然后我们有一个init-declarator列表,由三个init-declarators组成。其中一个有初始化程序,另外两个没有。声明符0
定义了“指向任何类型的声明 - 说明符 - 指示”。请参阅标准中的6.7“声明”以获取血淋淋的细节(以及我从上面的语法中留下的位)。
答案 2 :(得分:0)
不,ret
将始终为零。此函数只清除数组uint
中结构所指向的某些Regs
。
答案 3 :(得分:0)
看起来总是返回0.除非我只看到相关代码的一部分。
答案 4 :(得分: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大于reg。
for
循环在每次迭代中将n个字节归零,从Reg内部的Number字段的位置开始(supp Number
是32位= 4字节长整数,从字节4到字节7在{{} 1}})。
对于更易读的(uint *),(uint *)强制转换在C中是正常的,因为在处理内存时,简单(uint)可能不足以跨越整个可寻址堆。我很少发现(int *)强制转换迭代堆。
最后,在没有任何失败之后(在这种情况下没有任何东西可以失败,因为甚至没有使用ret),返回值为0 =正返回。
为了更好地解释在for循环中做了什么,假设Regs是一个结构,在一行中包含4个Reg istances(某种类型的数组),每个Reg是32字节宽,第二个字段是4到7的字节)被称为Reg
(例如32位整数字段)。
for循环运行之前和之后的内存字节可视化(以易于使用和读取的DECIMAL格式)可以是:
Number