【问题标题】:Output for this program concerning void pointers该程序关于 void 指针的输出
【发布时间】:2020-06-27 08:30:35
【问题描述】:

如果指针ptr的地址是2000,那么下面程序的输出是什么? [关于 32 位编译器。] (2)

#include <stdio.h>
int main()
{
  void *ptr;
  ++ptr;
  printf("%u",ptr);
  return 0;
} 

【问题讨论】:

  • 你试过了吗?你运行这个代码sn-p了吗? [提示]你在运行这个程序时遇到了什么问题?
  • 如何将指针的初始值设置为 2000。在在线编译器上尝试过,结果为 1
  • ++ptr 是不是一个有效的声明,ptr 是一个void 指针?
  • 有两个具体的错误,MSVC 编译器指出了它们。第三个没有被指出。 a) void* 的大小未知,b) 格式说明符不正确,c) 递增未初始化的变量。
  • @alk 这是真的,我应该说void。因为编译器不知道void 的大小,所以它不知道要在指针的值(地址)上增加多少。如果 OP 指定char*,它将添加1。如果 OP 指定 double*,它将添加 8,sizeof (double)

标签: c void-pointers


【解决方案1】:

下面的程序会输出什么?

从 C 标准的角度来看,输出没有定义,因为程序运行到未定义的行为,甚至在任何东西都被打印之前,有几个原因:

  1. 语句++ptr 尝试将ptr 增加一个未知数。递增指针尝试添加类型使用指针指向的字节数。 void-指针指向任何东西,任何东西都没有大小,甚至0

    T 为以下示例中的任何类型:

    T * p = ...; /* Define p and initialise it to any address. */
    

    然后

    ++p;
    

    相当于:

    p = (T*)((char*)p + sizeof *p);
    

    尝试以上方法,将T 替换为void

    注意:作为 C 标准的扩展,GCC 将 void-pointers 视为 char-pointers。

  2. ptr 是(试图成为,见 1.)在被应用时应用算术运算 未初始化。

  3. u 转换说明符是打印出一个unsigned int,代码传递一个指针。要打印指针的值,请使用p 转换说明符。

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2014-05-30
    • 2017-11-03
    • 2011-08-10
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2012-01-28
    相关资源
    最近更新 更多