【问题标题】:C cast void * to type_tC 将 void * 转换为 type_t
【发布时间】:2014-09-10 07:26:16
【问题描述】:

我有以下来自面向对象编程 C 书籍的代码:

{
  struct Set { int count; };

  struct Set * set =  malloc(sizeof(struct Set));
  void * p = set;

  const size_t size = * (const size_t *) p;
}

我无法理解最后一行的工作原理和原因。 size_t sizesize_t 类型指针的取消引用值。 type_t 类型的指针是从void* p 转换而来的。 当我将void* 转换为type_t* 时发生了什么,我在书中或在线教程中找不到任何信息。有人可以向我解释一下或推荐给我一个好的教程吗?

【问题讨论】:

  • 请先格式化您的代码。
  • 《面向对象的编程C书》让我觉得非常非常陌生……那本书叫什么?
  • Axel-Tobias Schreiner 的“Ansi-C 面向对象编程”。在一些 stackoverflow 问题中建议在这里。
  • 有兴趣的朋友可以在here或网上轻松找到本书

标签: c pointers void-pointers


【解决方案1】:

所以这里发生的情况如下:您有一个指向结构 (p) 的指针,并将其转换为 const size_t * 指针,并使用结果值。假设该值应该与p-&gt;count 的值相同,但不要真正指望这一点。根据Can I trust sizeof(size_t) <= sizeof(unsigned long int) is always true?intsize_t 的大小不得相同,因此您很可能最终会访问不属于您的内存。

【讨论】:

  • 您指向的链接说 size_t 不一定与 long int 大小相同,但它“隐含地将 size_t 限制为现有无符号整数类型的同义词”,这是与 int 大小相同
  • 好的,谢谢,我终于明白了。该代码取决于该 struct Set 包含单个 int。我认为在最后一行中,一些神奇的事情和大小总是包含结构集的大小,无论该结构有多大。
【解决方案2】:

在这里,void * p 被强制转换为 const size_t * 类型并用作const size_t size 变量的初始化程序。正在使用p 持有的[const size_t 类型] 地址中的值。

【讨论】:

  • 所以投射和 sizeof(p) 一样?
  • @user3597496 怎么来的? cast 与类型相关,而 sizeof() 是运算符。
【解决方案3】:

当您将 void* p 转换为 size_t* p 时,您是在告诉编译器 p 指向 size_t 类型的值

实际上 p 指向一个 Set 结构,它恰好包含一个 int。代码假设 size_t 类型与 int 大小相同,standard seems to suggest it will be

然而 size_t 是无符号的,所以如果 int 中的值是负数,它将不会被正确读取。目前Set结构中的数据是未初始化的,所以结果是随机的

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2013-10-25
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2012-07-23
    • 2011-09-28
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多