当前位置: 首页 > 知识库问答 >
问题:

正常结构变量衰减指针或堆栈帧

金伟
2023-03-14
struct student  
{  
      int roll_no;  
      int physics;  
      int chem;  
      float percentage;  
};

int main()  
{  
    struct student s = {1, 96, 98, 97.00};  
    printf("%d", *((int *) &s + 1));  
}

在上面的代码中,我们知道“s”是一个结构变量,我的问题是什么

不管“s”是一个衰减指针还是一个单独的堆栈帧都被分配给这个结构,如果它是一个衰减指针,我们就不需要把它放在

如果我们打印's'第一个成员值被打印,如果我们打印'

如果它不是任何东西,请帮助我们理解这一点。

而且,

如果Char数组是结构的成员,如何访问,请尝试以下*((Char*)

你的帮助将不胜感激。


共有2个答案

屠晟睿
2023-03-14

结构参数按值传递,除非

您可能会发现offsetof宏很有趣

#define offsetof(S, F) (((char *)&((S *)0)->F - (char *)0))

郑俊美
2023-03-14
匿名用户

“s”是否是衰减指针...

s 是一个结构。结构不会像数组那样自动转换为指针。(有些人说“衰败”,但这是一个口语化的术语,是不准确的。

…或者为结构分配了一个单独的堆栈帧,…

在< code>main中定义了< code>s后,编译器会自动为它分配空间。在常见的C实现中,编译器为此使用堆栈空间(除了优化可能导致替代方案,包括改为使用处理器寄存器、将该结构的使用合并到其他表达式中,或者完全消除该结构的部分或全部)。如果编译器为< code>s使用堆栈空间,它将为< code>main使用堆栈框架内的空间;它不分配单独的堆栈帧。

(通常,堆栈帧是一个函数在堆栈上使用的空间,有时会进行一些修改,例如“叶”函数,这些函数不会调用其他例程,也可能不会建立完整的堆栈帧。)

< code>printf("%d ",*((int *)

<代码>*((int*)

<代码>

…指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然…

然后在这个指针< code>(int *)上加1

然而,即使结构的下一个成员< code>physics刚好超出< code > s . roll _ no < sup > 1 ,C标准也没有定义当< code>*应用于它时会发生什么。这是因为C 2018 6.5.6 8说:

如果加法的结果[]指向数组对象的最后一个元素后一个,则不得将其用作被求值的一元*运算符的操作数

在 6.5.6 的上下文中,s.roll_no是一个只包含一个元素的“数组对象”,并且

如果违反了出现在约束或运行时约束之外的“应该”或“不应该”要求,则行为是未定义的…

1这并不能保证,因为C实现允许在结构中的成员之间插入填充。然而,典型的C实现不会在相同类型的成员之间插入填充,因为对齐不需要填充,这可以在编译时检查。但是即使没有填充,上面的陈述也适用。

 类似资料:
  • 问题内容: 我对Java不太了解。 我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。 经过几个链接后,我的结论是, 类变量(基元)作为对象包含的对象的一部分存储在堆中。 类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。 方法变量-基元-作为该堆栈框架的一部分存储在堆栈

  • 我对Java没什么概念。 我浏览了一些链接,发现博客上写着“存储在堆栈上的Java原语”,我觉得这取决于实例变量或局部变量。 经过几个环节,我的结论是, 类变量(原语)作为对象的一部分存储在堆中。 类变量——对象(用户定义)——作为对象的一部分存储在堆中。这对于参考对象和实际对象都是正确的。 方法变量——基元——作为堆栈框架的一部分存储在堆栈上。 方法变量-对象(用户定义)-存储在堆上,但是对堆上

  • 问题内容: 在C语言中,当我从函数返回堆栈创建的变量的指针时,在函数返回后内存将被丢弃,从而使指针无法取消引用。但是在Go中,编译器没有给我任何错误。这是否意味着这样做是安全的? 问题答案: 是的,这是安全的,并且是Go编程中的常规模式。Go使用转义分析来移动带有指针的所有值,这些指针会自动将栈转义到堆。您无需担心在何处分配值。 从Go常见问题解答中:“我如何知道是在堆还是在堆栈上分配了变量?”

  • 本文向大家介绍详解C++中的指针结构体数组以及指向结构体变量的指针,包括了详解C++中的指针结构体数组以及指向结构体变量的指针的使用技巧和注意事项,需要的朋友参考一下 C++结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结

  • 我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new

  • 问题内容: 在Linux(Debian和Ubuntu)中,如何在C的堆栈指针处输出当前值? 我尝试了google,但未找到任何结果。 问题答案: 不能移植甚至不能保证正常工作的一个技巧是简单地打印出本地地址作为指针。 这实际上将打印出其地址与当前堆栈指针的近似值