C语言中结构对象的内存位置

C语言中结构对象的内存位置,c,C,这是一段代码 #include <stdio.h> #include <stdlib.h> struct abc { int a; void* b; }; int main() { void* tmp = malloc(100); struct abc* myobj = tmp; printf("sizeof myobj:%ld\n", sizeof(struct abc)); printf("myobj:%p\n",

这是一段代码

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

struct abc
{
    int a;
    void* b;
};

int main()
{
    void* tmp = malloc(100);
    struct abc* myobj = tmp;
    printf("sizeof myobj:%ld\n", sizeof(struct abc));
    printf("myobj:%p\n", myobj);

    myobj->b = myobj + sizeof(struct abc);
    printf("myobj->b:%p\n", myobj->b);

    myobj->b = (void*)myobj + sizeof(struct abc);
    printf("myobj->b:%p\n", myobj->b);
}
我无法理解为什么在向从0x1610010开始的myobj添加16个字节时,myobj的位置是0x1610110 但是,当我将myobj类型转换为(void*)并添加16个字节时,我得到了正确的地址0x1610020

有人能给我解释一下吗


谢谢

指针数学!对于指针上的每个增量,地址都会随着指针中数据的大小而增加。这可以做到:

myobj->b = myobj + 1;

myobj+1根据需要添加尽可能多的字节以指向struct abc类型的下一个对象。所以,myobj+sizeof(struct abc)实际上是在添加sizeof(struct abc)*sizeof(struct abc)字节……这就是所谓的“指针算术”。您看到了
void*
指针上的指针算法与
abc*
指针上的指针算法之间的区别。@BenZotto:
void*
上的指针算法在标准C中无效。gcc(不幸的是IMHO)提供了一个语言扩展,使其与
char*
上的算法类似。
myobj->b = myobj + 1;