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", 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);
}

当我运行这段代码时,我得到以下输出

sizeof myobj:16
myobj:0x1610010
myobj->b:0x1610110
myobj->b:0x1610020

当我向从 0x1610010 开始的 myobj 添加 16 个字节时,我无法理解为什么 myobj 的位置是 0x1610110 但是,当我将 myobj 类型转换为 (void*) 并添加 16 个字节时,我得到了 0x1610020 的正确地址。

有人能给我解释一下吗?

谢谢

最佳答案

指针数学!对于指针上的每个增量,地址都会增加指针中数据的大小。这样就可以了:

myobj->b = myobj + 1;

关于c - C中结构对象的内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24718989/

相关文章:

c - 当应为False时返回True(C;使用函数)

c - boolean 抽象 C 程序

c - 在 C 中初始化指针的不同方法

c - 三元运算符作为 C 宏中三元运算符的操作数

c - 如何以编程方式访问 C 中的 bash 命令历史记录?

c - 使用 main 中给出的参数在 C 中进行字符串解析

c - 为什么通过直接赋值复制结构会失败?

c - 冒泡排序 C 编程

c - 当我声明 static int 数组而不是使用 DEFINE 时使用 Variable ,对吗?

c - 将转换说明符作为参数传递给 printf()