typedef struct DA da;
struct DA {
da* next;
int a;
int b[2];
int *c;
char *d;
char e;
int main(){
da* A;
A->a=1;
A->b[1]=3;
A->b[0]=4;
*(A->c)=8;
A->d="hello";
return 0;
}
如上的一个结构体,并没有什么特别的地方,对于我们来说,唯一比较关心的是各个成员在内存中的存放地址,从而知道存放的方式。
通过IDA打开
public _main
_main proc near
var_8= dword ptr -8
var_4= dword ptr -4
argc= dword ptr 8
argv= dword ptr 0Ch
envp= dword ptr 10h
push ebp
mov ebp, esp
sub esp, 8
and esp, 0FFFFFFF0h
mov eax, 0
add eax, 0Fh
add eax, 0Fh
shr eax, 4
shl eax, 4
mov [ebp+var_8], eax
mov eax, [ebp+var_8]
call __alloca
call ___main
mov eax, [ebp+var_4]
mov dword ptr [eax+4], 2
mov eax, [ebp+var_4]
mov dword ptr [eax+0Ch], 3
mov eax, [ebp+var_4]
mov dword ptr [eax+8], 4
mov eax, [ebp+var_4]
mov eax, [eax+10h]
mov dword ptr [eax], 8
mov eax, [ebp+var_4]
mov dword ptr [eax+14h], offset aHello ; "hello"
mov eax, 0
leave
retn
_main endp
可以看到如上的汇编代码,从而可以得出结论,各个变量在内存中是以连续地址存放的。
这里有两个地方需要特别注意一下,当声明一个这样的变量或指针,即开辟一个sizeof的大小,另外是数组不可以直接赋值,即不能A->b={1,2};
而必须单独的对一个一个int赋值。因为对于结构体来说,数组已经被封装,其中的赋值操作需要交给他的成员来处理。