c语言结构体中数据的存放机制

#include <stdio.h>
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赋值。因为对于结构体来说,数组已经被封装,其中的赋值操作需要交给他的成员来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值