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;