为什么结构体里的指针会偏移量会多偏移两位

作者&投稿:咸爽 (若有异议请与网页底部的电邮联系)
结构体的指针成员的值为什么会发生变化 坐等~

因为:
head[* total]->pub = pub;
head[* total]->name = name;
改变了指针地址,你应该用拷贝函数:
strcpy( head[* total]->pub , pub);
strcpy(head[* total]->name ,name);

之前定义了一个指针 ,应该是 test* 类型
在这个地方进行 强制转换为(test*) 赋值给 p
第三行 是将你的结构体指针 地址 转换成 void *

这个是结构体字节对齐问题。
结构体在存储时,要求结构体成员变量的起始地址按照结构体内最大长度的变量为单位对齐。
你这个结构体里
int,char*都是4字节的,该结构体按4字节对齐。
存储的时候是这样的:
第一个4字节,存放int型的age
第二个4字节,存放数组name的前4个元素
第三个4字节,第一个字节存放name的第5个元素,后面3个字节填充不用
第四个4字节,存放char *型的app。
所以app的偏移量就是3个4字节,共12字节。
详细的有关字节对齐的内容,网上找一找,很多的。

内存地址对齐导致的。如果用*表示一个字节,结构体的内存占用如下:


typedef struct {
int age;           // ****
char name[5];      // *****--- ,而char *app占4字节,塞不进去就空着,浪费了
char*app;          // ****
}mystruct;


你可以直接sizeof(to)看to的大小。
12并不是结构体的大小。而应该是16=int+char[5]+app=4+(5+3)+4.
其中5+3是字符数组,编译器自动补全。
app为4是不一定的,也有可能是2个字节,这个要看编译器。
你的int sizer = (int)&(((mystruct *)0)->app); 这句
看到的是地址0~app的大小,这里也就是app的地址。是0x0000000c(当然,只是逻辑地址),这里没有加上app所占空间,所以是12.


结构体后面的指针怎么用的
这句的意思就是定义两个该结构体类型的指针,linklist就是结构体指针类型,你可以用head->p,或者last->p来访问结构体的成员。

C语言里结构体的问题。结构体定义指针类型是怎么回事?
3、指针只是一个地址,HuffmanTree作为结构体指针同样是一个地址,因此不存在它内部有4个变量一说。严格意义上讲是HuffmanTree这个指针指向的结构体中有这4个变量,而这4个变量和在main函数里定义的普通变量一样,都占用实际内存,在新建结构体的同时为这4个变量分配内存空间。4、HT=(HuffmanTree)malloc...

结构体类型指向结构体变量的指针
例如,我们定义了一个名为`Student`的结构体类型,其中包含`num`、`sex`和`score`成员。通过定义一个`Student`类型的变量`stu`和一个指向`Student`类型的指针`p`,可以将`p`指向`stu`,即`p = &stu`。这样,`p->num`就等价于`(*p).num`,它们都能访问到`stu`的`num`成员。在C++中,...

单链表中为什么要定义一个结构体类型的指针?
本回答参考以下网页网页链接 链表的每个节点的指针指向的是与该链表结构一样的节点。打个比方,指向int的,指针类型是int型指针变量。链表定义的结构体,就是描述链表结构中节点的组成。定义的指针呢,是种嵌套,指向结构体本身。而结构体是一种数据类型,而不是具体的一个变量。所以这里可以理解为定义的...

可以指向不同类型结构体的指针
LPVOID 试试这个,这个是未知类型的指针,其实指针都是一个32位无符号INT或者LONG型,在VC中都是DWORD(两个字,四个字节,一共32位,和操作系统有关)。理论上是可以的,但是指针指向对应的结构体以后应该是不能再指向另外一个结构体了,因为你在让指针P(假设是P)进行“++”操作时,实际上指针的...

指针与结构体的关系??
1,很显然啊,p是什么,p是指向结构体这个类型的指针。也就是说,p里面放的地址,你对它进行引用,他去这个地址找,会发现一个结构体变量。你得思维开阔点儿,把结构体也想成一个普通类型的变量。stu.age是int类型,你讲int类型的地址给一个结构体,肯定不对啊。但是我想说的是,这两个地址的值...

c++中如何在一个结构体里定义一个指向该结构体的指针?
有下面两种方式:1、struct s{ char c;int i;};struct *p1;\/*p1是指向s结构体的指针*\/ 2、typedef struct{ char c;int i;}s,*ps;s *p2;\/*p2是指向结构体的指针*\/ ps p3;\/*p3是指向s结构体的指针*\/

数据结构里面->是什么意思?
-> 左边是结构体指针,右边是结构体成员,因此p->next 的含义是p指针指向结构体变量的next数据域。typedef struct{int data;struct Lnode *next。数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种...

结构体最后大括号后面跟两个指针
一、指向结构体的指针 结构体最后大括号后面跟一个指针时,表示这个结构体上面的所有变量都可以被指针指向。这种指针通常称为指向结构体的指针,可以使用它来访问结构体中的所有成员。下面是一个例子:struct student { char name[20];int age;float score;} *p;int main() { struct student s = {...

一文彻底搞懂Go结构体方法指针和值的区别
一文彻底搞懂Go结构体方法指针和值的区别众所周知,Gostruct定义方法时使用指针还是值的区别就是在方法内修改属性值时,用值定义的方法所做的修改只限于方法内,而指针则没有这个局限。文章如果到这里就结束了,那么

新县18564464139: 结构体中的指针是什么意思呢? -
学适莱阳: 1、结构体中的指针和结构体中的其他变量没有什么不同,结构体中的一个成员变量而已.只是这个变量是指针类型,和其他普通指针一样使用. 2、看变量名和结构体名称,你发的这种应该一般用在链表的实现中,这个Node结构体就是链表中的一个节点,然后结构体中定义一个指针变量next,用于指向下一个节点.

新县18564464139: C语言中链表中的结构体指针变量问题...求教 -
学适莱阳: 定义结构体指针变量时,只分配存储指针类型需要的空间,比如ListNode *p;这里p有给他分配存储指针的4个字节的空间. 实际上你是要让p指向一个结构体空间的,这个结构体空间在哪? 可以先定义ListNode a; 然后 p=&a; 这时p指向一个...

新县18564464139: 关于结构体成员在结构体中的偏移位置,求教 -
学适莱阳: 因为你把t定义成了一个结构体指针,并且指向为0的起始地址. struct test_s *t = NULL;这句执行完以后,t->pad0的地址就是0x00000000这个单元.因为结构体中成员都是int型的,所以t->pad1的地址为0x00000004,依次类推t->pad9的地址就...

新县18564464139: 关于c++中结构体指针的运算符重载问题 -
学适莱阳: 运算符重载的条件是,必须存在至少一个自定义的类型.而指针实际上就是地址,即一个32位的整数值,它们的大小是直接进行数值的比较的 如果想比较2个指针所指的对象的大小,可以对它们取 * 操作,再调用 operator < 即可.另外,楼主写...

新县18564464139: 结构体可以使用偏移赋值吗?? -
学适莱阳: C/C++中使用指针偏移赋值是可以的.但是用户自己必须清楚当前指针的指向的位置及其具体的含义.提醒你,结构体存在“内存对齐”的情况,即sizeof()运算的值会和结构体成员所有成员程度之和不等.

新县18564464139: 如何理解指针,多重指针,结构体指针 -
学适莱阳: 如果一个指针变量存放的是某个对象的地址,则称这个指针变量指向该对象.在C++程序设计中,指针变量只有确定了指向才有意义.1. 定义指针变量的一般形式如下:类型名*指针变量名1,*指针变量名2,... *指针变量名n ;2. 空指针 空指针是...

新县18564464139: 指向结构体的指针如何使用结构体中的元素 -
学适莱阳: 对于标题中的问题答案是肯定的.如果第一个成员是数组的话,指向的也是数组第一个元素的地址.对于第三个问题,你说的“该指针”不太清楚,我就按我的理解来说:如果指针是指向结构体,那么指针加1的话,指针就会向后移动结构体大...

新县18564464139: 关于结构体的指针
学适莱阳: 首先,明白指针的实质是地址?不论什么指针都只存储了一个地址数据,即同一台机器里所有指针占的空间一样大.另外,指针代表的是实际数据单元的首地址,仅仅声明一个指针并没有分配数据空间,所以结构体指针实际用的时候需要用到动态内存分配.这就象用标签占位子,先贴上标签不管出处目前是否有人,你想坐的时候就对号入坐,该覆盖的就覆盖.贴标签仅消耗了标签,位置可能别人还在用,你坐上去才真正耗了座位.

新县18564464139: 结构体作为函数参数值传递的问题 -
学适莱阳: 传结构体地址与传结构体指针二者都可以作为传出参数,因为接受函数必须为其定义一个结构指针来接收,这样在函数内就可以修改结构体,在这点上二者没有区别.定义结构体指针未分配地址空间就作为参数传递会,如果你想把它作为传出...

新县18564464139: 有关结构体,链表中指针的几个问题,求助! -
学适莱阳: (1)有区别,但是区别不大,你把结构体当成是一种数据类型来看待就好理解了 (2)没有让它指向结构体变量,就直接能使用如“p->next"这个是错误的,定义一个链表指针P,要想使用P,要么p=&student,要么p=malloc(分配内存),才能使用p->next

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网