如何在C中识别对象

时间:2017-10-16 08:59:22

标签: c

术语对象由C11标准第3.15节定义:

  

对象

     

执行环境中的数据存储区域的内容   它可以代表值

给出以下代码:

int x;

int y[10];

struct my_struct {
  int a;
  int b;
};
struct my_struct z;

在上面的代码中,xyz是不同的对象? z的成员是同一个对象吗? y的元素是同一个对象吗?

4 个答案:

答案 0 :(得分:3)

  

在上面的代码中,xyz是不同的对象?

是的,它们占据了完全独立的存储区域。

  

z的成员是同一个对象吗?

不,z.az.b是两个不同的对象。可以说它们是z的子对象,因为每个的存储都包含在整体的存储中,但它不是完全相同的存储区域。该地区的规模也起到了一定作用。

  

y的元素是同一个对象吗?

不,y的每个元素都是一个单独的对象。但是,通过与上述相同的推理,可以将它们视为y的子对象。

答案 1 :(得分:3)

C标准中术语 object 的含义很简单:在内存中分配的变量。事实证明,它与在具有OO支持的语言中使用的对象的定义相同。

通常,对象具有某种类型(有用),请参阅3.15中的其余部分:

  

注意引用时,对象可能被解释为具有特定类型;见6.3.2.1。

  

在上面的代码中,x,y和z是不同的对象吗?

是的,因为它们是不同的变量。

  

z的成员是同一个对象吗?

它们是z对象的一部分,但同时是不同的子对象。 ab是不同的对象,但是当结构被称为整体时,它们是同一struct对象的一部分。

答案 2 :(得分:1)

图形:

   +–––+
x: |   |
   +–––+

   +–––+
y: |   | y[0]
   +–––+
   |   | y[1]
   +–––+
    ...
   +–––+
   |   | y[9]
   +–––+

   +–––+
z: |   | a
   +–––+
   |   | b
   +–––+

xyz均为对象。每个y[i]z.az.b都是如此。

答案 3 :(得分:0)

C标准使用“对象”一词来描述至少三个不同的概念:为特定目的专门分配的一系列连续寻址字节,可能的地址和类型的任意组合>用来标识分配或分配的一部分,无论它是否实际使用了 ,还是曾经将要使用的地址和类型的组合< / em>在某些上下文中用于访问存储或派生已或将以这种方式使用的另一个对象[相同定义]。这些定义之间的区别在K&R的书 C编程语言中所描述的语言中并不重要,但是标准添加了规则,使得有必要区分这些含义,而没有提供绘制所必需的术语。这样的区别。

当C标准的N1570 p6.5p7表示某个对象只能通过某些类型的左值访问其存储值时,尚不清楚“对象”到底是什么意思。如果它是指“对象”的第二种含义,那么几乎所有对非字符类型的左值进行的访问都将调用UB。在解释文本时,使用“对象”的第三种含义可能会更有意义,但是此类“对象”的有效生命周期与基础存储的有效生命周期不同。

在您的示例中,存在三种分配-xyz。如果sizeof (int)是4,而sizeof z是8,则在unsigned char *p = (unsigned char*)&z.b之后,将存在一个unsigned char标识的类型*p的对象,但是该标准尚不清楚指针转换是否会导致unsigned char对象存在于以前没有的对象,或者仅产生了指向unsigned char对象的指针,该对象是在创建z时创建的,并且将以只要z就可以。