【问题标题】:basic types in CC中的基本类型
【发布时间】:2011-12-19 00:20:17
【问题描述】:

这么快,奇怪的问题: 我参加了考试,题目是:

char c = 'A'
char *p =&c
char **p2 = &p
void *v = &p2

写出以下表达式的类型(即int、void*等):

  1. &v
  2. p2 + 1
  3. v[0]

我回答:

  1. void **
  2. char**
  3. 非法

并失去了全部信用。我只是想在尝试拿回积分之前征求别人的意见。

  1. 我不太确定,但我认为,因为v 是一个指向内存地址的void 指针,所以v 的地址应该是一个void**。但是,如果 v 被取消引用,它将是 char****

  2. p2char**,因此向其添加 1 仍会使其成为 char**

  3. v[0] 不存在。

如果有人能帮我解决这种愚蠢的问题,我将不胜感激。 谢谢。

【问题讨论】:

  • v 不能自行取消引用(即没有强制转换)。这使您的第一点的最后一句话错误,但您的第三个答案正确。
  • 猜你的意思是“如果 v 被强制转换为可以取消引用以获取 c 的值的类型”而不是“如果 v 被取消引用”

标签: c types


【解决方案1】:

由于您给出的原因,您的答案是正确的(除了关于取消引用 v 的一点,尽管听起来您已经知道不能取消引用 void *)。

【讨论】:

  • “你不能取消引用void *”是什么意思?潜在的编译时/运行时错误?只是以为你可以做到,但你得到一个毫无意义的数据。您能否进一步解释一下。这也是我不确定的一点:)。谢谢。
  • @Summer_More_More_Tea:编译器不允许你这样做:void *v; ... *v;。它根本不会编译。
  • 我在我的盒子上试过了。 v[0] 确实有大小,sizeof(v[0]) 是 1。但是当我想获取 v[0] 时抛出错误。奇怪。
【解决方案2】:

p2+1 是一个等待发生的段错误,v[0] == *(v+0) == *v 是无效的,因此无效。如果进行类型转换,它应该是一个 char**。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多