Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这段代码是如何确定数组的大小的?_C_X86_Structure - Fatal编程技术网

C 这段代码是如何确定数组的大小的?

C 这段代码是如何确定数组的大小的?,c,x86,structure,C,X86,Structure,我无法理解IA32代码。我理解第一条movl指令表示%eax=q,第四条movl指令表示%eax=p,但我不理解第二条、第三条和第五条指令的含义。我认为第二条指令意味着q+B(char1byte)=q+40。是这样吗?第二条和第三条指令对eax的值进行操作,该值包含q的值 第二条指令获取由q加40字节指向的内存位置的值。添加位移是因为引用的struct成员的偏移量为40字节 第三条指令添加另一个成员,基本上计算表达式v1+v2。同样,eax(包含q的值)指向str2,位移12是被引用构件的结构的

我无法理解IA32代码。我理解第一条movl指令表示%eax=q,第四条movl指令表示%eax=p,但我不理解第二条、第三条和第五条指令的含义。我认为第二条指令意味着q+B(char1byte)=q+40。是这样吗?

第二条和第三条指令对
eax
的值进行操作,该值包含
q
的值

第二条指令获取由
q
加40字节指向的内存位置的值。添加位移是因为引用的
struct
成员的偏移量为40字节

第三条指令添加另一个成员,基本上计算表达式
v1+v2
。同样,
eax
(包含
q
的值)指向
str2
,位移
12
是被引用构件的
结构的偏移量


第四条指令加载带有
p
eax
,第五条指令加载计算表达式
v1+v2
,其中
p
加上96个字节,即
p->y
,点。

因此,数组“Array”和“s”的大小为40?@future亿万富翁
Array
必须位于索引
0
(第一个成员的地址必须等于结构的地址).
t
紧随其后,然后是
s
,然后是
u
,因为成员变量不能在
struct
中重新排序。因为
t
struct
中位于
u
之前,它必须位于较低的索引,即
12
u
位于
40
。这意味着
sizeof(数组)=12+填充
sizeof(s)=40-&s
(这只是伪代码,不会编译。)
typedef struct {   
    char array[B];    
    int t;            
    short s[B];       
    int u;            
} str2;

typedef struct {
   short x[A][B];  
   int y;          
} str1;         

void setVal{str1* p, str2 *q) {
   int v1 = q->t;                
   int v2 = q->u;
   p->y = v1+v2;
}
movl 12(%ebp), %eax
movl 40(%eax), %edx
addl 12(%eax), %edx
movl 8(%ebp), %eax
movl %edx, 96(%eax)