将参数传递给可变参数函数时,强制转换为void *有什么作用?

卡尔马留斯

还有另一个问题讨论这样的问题:当printf是变量的地址时,为什么要使用void *?,但这仅回答了为什么不应该将指针打印为int的原因。

另一个问题讨论了在将指针传递给可变参数函数时,应始终将其转换为void *:参数转换:(常规)指向void指针的指针,需要转换吗?它说,如果不这样做,则会调用未定义的行为,但不会超出此范围。

确实:

      if (pIReport4 == NULL)
      {
          printf("It's NULL but when I print it, it becomes: %p\n", pIReport4);
          printf("It's NULL but when I print it and cast it into (void*), it becomes: %p\n", (void*)pIReport4);
          printf("And NULL is: %p\n", NULL);
      }

印刷品:

It's NULL but when I print it, it becomes: 0xc68fd0
It's NULL but when I print it and cast it into (void*), it becomes: (nil)
And NULL is: (nil)

pIReport4是一个非空指针。

很明显,如果不进行强制转换,它将把其他东西推入堆栈。它会推动什么?为什么?

使传递非空指针成为未定义行为的基本原理是什么?对我来说这没有意义...

我一直认为指针强制转换只是编译器在读取或写入时如何解释所指向数据的提示。但是,当仅传递指针值时,我希望无论类型如何,它都传递相同的字节序列。

吊床

正如第二个链接中答案所说明的那样

对于printfp转换说明符需要一个void *参数。如果参数的类型不同,则函数调用将调用undefined behavior因此,如果的参数p是对象指针类型,void *则必须使用()强制转换。

也就是说,由于您的代码段调用了未定义的行为,因此您可以获得任何预期或意外结果。您得到的结果也可能因编译器而异。在我的编译器(GCC 4.8.1)上,给出的结果是:
在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将原子传递给可变参数时,为什么要调用复制构造函数?

来自分类Dev

将参数传递给addEventListener时,函数不起作用

来自分类Dev

将List的元素作为参数传递给具有可变参数的函数

来自分类Dev

将数组的所有元素传递给具有可变参数的函数(...)

来自分类Dev

为什么规范禁止将类类型传递给可变参数C ++函数?

来自分类Dev

当没有__init__方法时,为什么此代码将参数传递给构造函数?

来自分类Dev

将此char数组强制转换为函数有什么作用?

来自分类Dev

如何合并传递给具有可变参数的函数的数组

来自分类Dev

当将带有 void * 参数的函数传递给 dict 时,Cython 会抛出错误

来自分类Dev

能够将参数传递给没有参数的函数

来自分类Dev

能够将参数传递给没有参数的函数

来自分类Dev

为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

来自分类Dev

没有参数的`bundle`有什么作用?

来自分类Dev

没有参数的`exec`有什么作用?

来自分类Dev

没有参数的`bundle`有什么作用?

来自分类Dev

没有参数的 `exec` 有什么作用?

来自分类Dev

为什么不能将void传递给没有参数的函数?

来自分类Dev

在带有可变参数的函数中传递“枚举”时出错

来自分类Dev

C ++:当作为函数参数传递时,此插入表达式有什么作用?

来自分类Dev

当将这些参数传递给类型化的函数时,为什么TypeScript不推断函数的参数类型?

来自分类Dev

为什么Clang将结构参数强制转换为int

来自分类Dev

为什么Clang将结构参数强制转换为int

来自分类Dev

为什么通过通用引用运算符 (&&) 将变量的引用传递给可变参数模板函数失败?

来自分类Dev

copyWith()函数有什么作用?

来自分类Dev

函数 setlocale 有什么作用?

来自分类Dev

将向量传递给函数时,默认参数(如果有)应该是什么?

来自分类Dev

具有不同类型参数的可变参数函数传递给它

来自分类Dev

为什么将额外的参数传递给C函数不会导致编译时错误?

来自分类Dev

在此示例中,将参数传递给函数时,c ++编译器会做什么?

Related 相关文章

  1. 1

    将原子传递给可变参数时,为什么要调用复制构造函数?

  2. 2

    将参数传递给addEventListener时,函数不起作用

  3. 3

    将List的元素作为参数传递给具有可变参数的函数

  4. 4

    将数组的所有元素传递给具有可变参数的函数(...)

  5. 5

    为什么规范禁止将类类型传递给可变参数C ++函数?

  6. 6

    当没有__init__方法时,为什么此代码将参数传递给构造函数?

  7. 7

    将此char数组强制转换为函数有什么作用?

  8. 8

    如何合并传递给具有可变参数的函数的数组

  9. 9

    当将带有 void * 参数的函数传递给 dict 时,Cython 会抛出错误

  10. 10

    能够将参数传递给没有参数的函数

  11. 11

    能够将参数传递给没有参数的函数

  12. 12

    为什么不将具有默认参数的函数传递给模板化的构造函数,并使用lambda将其存储为std :: function <void()>起作用?

  13. 13

    没有参数的`bundle`有什么作用?

  14. 14

    没有参数的`exec`有什么作用?

  15. 15

    没有参数的`bundle`有什么作用?

  16. 16

    没有参数的 `exec` 有什么作用?

  17. 17

    为什么不能将void传递给没有参数的函数?

  18. 18

    在带有可变参数的函数中传递“枚举”时出错

  19. 19

    C ++:当作为函数参数传递时,此插入表达式有什么作用?

  20. 20

    当将这些参数传递给类型化的函数时,为什么TypeScript不推断函数的参数类型?

  21. 21

    为什么Clang将结构参数强制转换为int

  22. 22

    为什么Clang将结构参数强制转换为int

  23. 23

    为什么通过通用引用运算符 (&&) 将变量的引用传递给可变参数模板函数失败?

  24. 24

    copyWith()函数有什么作用?

  25. 25

    函数 setlocale 有什么作用?

  26. 26

    将向量传递给函数时,默认参数(如果有)应该是什么?

  27. 27

    具有不同类型参数的可变参数函数传递给它

  28. 28

    为什么将额外的参数传递给C函数不会导致编译时错误?

  29. 29

    在此示例中,将参数传递给函数时,c ++编译器会做什么?

热门标签

归档