首页天道酬勤C语言结构体数组的使用(c语言结构体数组定义和使用)

C语言结构体数组的使用(c语言结构体数组定义和使用)

admin 02-21 01:20 247次浏览

# include ' stdio.h ' struct stu { charname; int age; char sex; (; 结构灾难{ ' m ',20,' f'}; int main () printf ) )0x%x(n ),student ); printf(0x%x(n )、student ); printf(0x%x(n ),) student ) [0]; printf(0x%x(n ),) student ) [10]; printf(0x%x(n ),student.name ); }输出

0x 61f e 100 x 4030100 x 61f e100 x 61f e100 x 403010连续运行((按什么) ) )、……。 引用认识的用户的结论。

https://www.zhi Hu.com/question/308153975/answer/569076494

作者:匿名用户

链接: https://www.zhi Hu.com/question/308153975/answer/569076494

来源:知乎

版权归作者所有。 商业转载请联系作者取得许可。 非商业转载请注明出处。

我来改正错误。 以前,结构名称与数组名称一样表示数组的第一个元素和结构的第一个成员地址,但这是错误的。 关于数组可以这么说,但是结构体不成立(到处是编译器耍的把戏…() )我写了次要测试:int main ) )。

结构stu { char * name; char *stunum; (}小明; Xiaoming.name=(char* )0x12345678; printf(0x%x(n ),小明); printf(0x%x(n ),xiaoming.name ); printf(0x%x(n ),小明); printf(0x%x(n ),xiaoming.name ); printf(0x%x(n ),xiaoming.stunum ); }首先,让我们看看这个程序输出了什么。 请注意小明的值和小明. name的值和小明的区别。直接输出结构的名称小明的值与结构的地址小明不同,它输出结构的第一个元素的值,即指针小明. name,因为所有这样的编译器决策:都是在我上面的箭头

printf(「0x%x\n”,xiaoming.name ); 正在计算这两个,即小明的值和小明. name的值。 此时编译器正在使用mov。 也就是说,将位于xiaoming.name地址中的值移动到rdx和rax寄存器中。 两个分别为:printf(「0x%x\n”、xiaoming );

printf(「0x%x\n”,xiaoming.name ); 请注意,这里编译器使用的是lea。 这是计算地址的指令,不会取地址中的值。 因此,这两个输出都是小米. name的地址,而不是小米. name的值。 因此,结构名称的值和结构取地址不同,第一个是表示结构第一个要素的值,第二个是表示结构第一个要素的地址。 同样,取数组名称值和数组名称地址的验证小程序:int main

int num[10];

printf(「num=0x%x\n”,num );

printf(num=0x%x(n ),num );

printf(「num[2]=0x%x\n”,num[2];

printf(num[2]=0x%x(n ),num[2];

}输出:符合我们的认识,数组名称和数组名称地址相同。 编译器是怎么做的呢? 看吧,编译器对数组名称和数组名称取地址的计算方法相同,都是使用lea指令计算地址。 访问num[2]的第三个相应命令使用mov。 因此,让我们总结一下结论。 对:数组名称和数组名称取地址相同,表示数组第一个元素的地址。 编译器都使用lea指令向结构体名称和结构体名称取地址。 前者表示结构的第一个元素的值,后者表示结构的第一个元素的地址。 这是因为编译器在结构名称中使用了mov指令。 现在试着回答提问者上面的问题,而不是lea。试着跑了我的机器ubuntu16.04 (小印第安人)。注意到每次运行时第一个输出都不确定。 唯一确定的是后面的3字节是0x636261。 为什么会这样呢? 我已经说过,使用%x %d等输出结构名称是直接输出结构开头元素的值,但实际上并不准确。 实际上,由于从开头要素开始将4字节或8字节集中输出,因此这里不仅输出’a’的ascii的值61。 为什么输出最后3个字节一定是0x636261? 如上所述,我是小印第安人。 “a”“c”的地址递增1,而根据小端节序的特征,将低位置于低位地址,“a'=61、“b”次之…另一个特征实际上是高位字节值和低位输出地址值相同! 也就是说,0x7ffc35和0x7ffe9f。 其实这也不是偶然的。 因为字符’c’的存储地址上面是ebp指向的地方,而ebp指向的堆栈中存储了上一个函数的ebp。 堆栈上最近的堆栈帧的前几个字节一定是相同的。 如果不知道这句话,只要搜索函数调用堆栈帧就知道了。 至于提问者的第一个问题为什么减少了16字节,我的回答是这是偶然的,而且从提问者的输出来看,应该不是小端序。 第二个问题sizeof(a )为什么是8? a是指针,对指针应用sizeof实际上是机器的字长,标题应该是64位机。 第三个问题很多的16字节属于结构体吗? 我已经说过了,并不是多了16字节,偶然知道滑了这么久,很抱歉。 我去复习。 还没参加期末考试----原来的回答,有错误----结构体和排列其实是一样的。 区别在于数组元素的大小相同,结构体元素的大小可以不一致,但编译器在访问内部元素时用相同的方法更改:基地址,将数组名称和结构体名称作为目标地址,加上元素相对于起始地址的偏移。 众所周知,数组名称表示数组的起始地址,但结构也是如此。

——————————————————————————————

另一个非常有趣的结论是

(结构名称(n )无论n取什么值,结果都与结构名称的含义相同。 原因不明。

怎么使用GridView实现桌面图标显示怎么用Java比较两个对象的大小jQuery3.6.1新版本有哪些新特性
() ()
相关内容