不确定int regs = 0,i,* regs意味着什么

时间:2012-07-10 18:53:12

标签: c

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

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;

是,或为什么它有效。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

int ret = 0, i, *reg;

定义了三个变量:名为int的{​​{1}},名为ret的{​​{1}}和名为int的{​​{1}}。仅初始化iint*)。

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

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