为什么我们可以得到像这样的结构的偏移?

时间:2015-03-06 09:14:53

标签: c struct offset

今天我得到了一些信息,我们可以通过这种方式得到结构中场的偏移量:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

struct sdshdr {
    int len;
    int free;
};

int main(int argc, char* argv[])
{
    printf("%d\n", &sdshdr::len);
    printf("%d\n", &sdshdr::free);
}

虽然我在编译时收到警告,但它可以成功运行。 我们怎么解释这个?我搜索网络时没有获得信息。 谁能帮忙解释一下这里发生了什么?

编译参数:gcc -g -O2 -Wall -o main.o main.cpp

1 个答案:

答案 0 :(得分:3)

您展示的代码不是符合C的代码。这些结构

&sdshdr::len&sdshdr::free不是有效的C构造。

您似乎将代码编译为C ++代码。

如果您想知道C中结构的数据成员的偏移量,那么您应该使用标题offsetof中声明的标准宏<stddef.h>

例如

#include <stdio.h>
#include <stddef.h>

struct sdshdr {
    int len;
    int free;
};


int main(void) 
{
    printf( "offset of len is equal to %zu\n", offsetof( struct sdshdr, len ) );    
    printf( "offset of free is equal to %zu\n", offsetof( struct sdshdr, free ) );  

    return 0;
}

程序输出可能看起来像

offset of len is equal to 0
offset of free is equal to 4

如果你的意思是C ++那么这些表达式

&amp; sdshdr :: len and&amp; sdshdr :: free`表示结构中数据成员的指针。