刷OJ时碰到这样的问题,访问结构体中数组的问题。
在网上查资料学到了这样的一些知识:
- 结构体中成员的地址是相对于结构体整个地址的相对地址。
- 访问结构体中的数组名时,是获取数组的相对地址,而访问指针成员的时候,是获取指针所指向地址中的内容。
- %x,16进制。
- 直接printf(s->a)的话,程序会crash(s->a为访问数组名,返回值应该是16进制的数组的地址,并且是相对于整个结构体的相对地址。),访问元素地址是一定不会挂掉的,&s->a,运算优先级,不需要加()
- 关于长度为0的数组,例如: char a[0],声明这类数组的目的,是我们为了给这个数组分配一块连续的地址,如果单纯使用指针,分配到的地址可能是不连续的。这样的意义有两个:1)方便内存释放,我们所有分配的内存是在一起的。2)提高访问内存的速度,估计提升不是很大,因为都是根据偏移量寻址去访问其中的内容。3)可以减少一些内存碎片。
- 获取指针所指向的数组长度:用sizeof(p)/sizeof(int),仔细一想,这特么怎么算都是1啊。
gdb的命令
- a 为结构体,p a可以输出结构体地址,p *a可以输出整个结构体中各个成员的地址,p a->b 可以输出结构体中元素的内容以及地址。
- x /10b a 输出分配给该结构体10个字节的内容。
C类语言学习中的随笔
原文:https://www.cnblogs.com/dzhx/p/11637589.html