【问题标题】:sizeof(*p) are my results undefined?sizeof(*p) 我的结果未定义吗?
【发布时间】:2016-02-17 19:03:04
【问题描述】:

在这段代码中,我取消了一个未初始化的元素。我的结果是否未定义?

int x[10];
int *p = x;

cout << sizeof(p) / sizeof(*p) << endl;

【问题讨论】:

  • 什么意思“一个不存在的元素”?就在那儿。
  • 意思是*未初始化。
  • 您的结果已定义但无用
  • 您没有取消引用任何内容,因为sizeof 的操作数表达式是未计算的。 “取消引用”的意思是“评估间接表达式”。
  • sizeof 在完整时工作,而不是在运行时工作。代码相当于sizeof(int*) / sizeof(int);

标签: c++ pointers sizeof dereference


【解决方案1】:
cout << sizeof(p) / sizeof(*p) << endl;

是完全合法但不完全有效的代码。 sizeof 在编译时进行评估。如果它们不能在编译时被评估,你会得到编译器错误。

惊喜将是预期的结果。你不会得到10。要获取10,您需要使用:

cout << sizeof(x) / sizeof(x[0]) << endl;

【讨论】:

  • @Slava,不幸但真实。
  • @MajorasCoffee,这是正确的。由于sizeof 是在编译时评估的,所以唯一重要的是对象的类型,而不是它是否具有有效值。
  • @MajorasCoffee 没关系。问题是你试图实现将指针的大小划分为 int 的大小。这对你来说几乎没有任何意义。
  • @Slava 最初我认为我认为它会导致 4/4 是正确的,但我想仔细检查我的答案,所以我查看了这个练习,有些人认为结果未定义所以我不确定。感谢您的帮助!
  • @MajorasCoffee 结果是实现定义的。 sizeof(pointer) 会根据您使用的系统而变化。通常在 32 位系统上为 4,在 64 位系统上为 8。也许这就是未定义的意思。
【解决方案2】:

在 c++ 中,表达式“*p”和“p[0]”的计算方式相同,所以:

*p == p[0]

将评估为真。我不知道您所说的“不存在的元素”是什么意思。

我认为您的代码不会像您想的那样做。线

cout << sizeof(p) / sizeof(*p) << endl;

将计算 int* 类型的 sizeof(p) 并给出类似 4 的值,评估 int 类型的 sizeof(*p) 并给出类似 4 的值,然后将它们除以得到 1。

此代码完全有效,但由于大多数常见系统使用 4 个字节作为整数和指针,因此您很可能每次都打印出“1”。

如果你改为写:

cout << sizeof(x) / sizeof(*x) << endl;

cout << sizeof(x) / sizeof(x[0]) << endl;

你会得到“sizeof(int[10]) / sizeof(int)”,等于10。这是因为x的类型不是int*,而是int[10],或“10 个整数的数组”。

正如 R Sahu 所回答的,sizeof() 在编译时进行评估,因此如果它无法确定大小,您的代码将无法编译。

【讨论】:

  • 最初我认为我认为这会导致 4/4 通过我的书,但我喜欢仔细检查我的答案,所以我查看了我正在进行的练习,有些人有结果是未定义的,所以我不确定。感谢您的帮助:)
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多