【问题标题】:Is a pointer assigned or not in C?在 C 中是否分配了指针?
【发布时间】:2011-02-27 08:42:39
【问题描述】:

我如何编写一个 if 语句来告诉程序是否分配了指针?

错误的例子

if (*badpdr[0]==0);

【问题讨论】:

标签: c pointers variable-assignment if-statement


【解决方案1】:

你的意思是if (badptr==NULL)

请注意,在定义指针或“取消分配”时(例如,删除它引用的对象),您必须首先将指针设置为 NULL。否则,它将包含垃圾,并且此测试将失败,因为该值不会是 0。

您也可以与 0 而不是 NULL 进行比较,SO 上已经有足够的参数,这是正确的形式,所以我不会重复它们。

【讨论】:

  • 公平地说,在 C 中确保 badptr 为 NULL 是您自己的任务。因此将其初始化为 NULL(如果您不将其初始化为其他值)并使用 ptr = NULL 执行删除语句。但是,无论如何,这是您应该这样做的,因此没有真正的缺点。
  • @Simon:实际上我不确定,自从我编写/教授 ANSI-C 以来已经很多年了,我的思想被 C++ 蒙蔽了(尽管我承认,自从我写任何东西以来已经很多年了C++ 或者 :)
  • NULL 最初来自 C。在 NULL K&R 代码使用 0(零)之前,它充当 NULL。如果您想尝试,零仍然有效....人们认为 NULL 更清晰。
  • @Simon:如果我没记错的话,NULL 在 C 中实际上比在 C++ 中更干净(虽然我没有做太多 C,所以这是传闻)
  • 你们让我很高兴这些天我是一名 Java 开发人员 :)
【解决方案2】:
char *ptr=NULL;

初始化指向NULL的指针;然后稍后你可以检查它是否是NULL,看看它是否有效,然后再尝试尊重它。

【讨论】:

    【解决方案3】:

    C++ 中,当未分配int 变量时,它们的初始值为2686392!

    【讨论】:

      【解决方案4】:

      您可以为SIGSEGV 安装信号处理程序,然后尝试取消引用指针 - 如果您发现自己在信号处理程序中,则指针未分配(或指向无效的内存地址,这基本上是同一件事)

      但是,在某些情况下,未分配的指针指向属于进程内存空间的有效地址 - 在这种情况下,不会引发 SIGSEGV

      【讨论】:

      • 投反对票的人会这么好心解释投反对票吗?无论出于何种原因,您可能不喜欢这个答案,但这并没有错。
      • 如果您使用信号处理程序并尝试取消引用指针并且指针指向可用内存之外的区域,它将抛出一个只允许抛出一次的神奇异常。然后,当您稍后尝试分配内存时,分配器将寻找该异常以查看它是否需要增加地址空间并且不会看到它,并且事情将无法正常工作。请注意,前面的所有文字都略有偏差,因为我是根据我对一篇文章的模糊记忆写的,这篇文章解释了为什么尝试通过取消引用来验证记忆是一个坏主意。
      • @Brian 你在说哪些例外?问题是关于 C,而不是 C++,C 没有任何例外。我写的是关于信号的,而不是例外,信号是一个非常不同的东西。我认为你混淆了两个完全不同的概念。
      • 保护页面异常。见msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx。它们不是 c++ 异常。它们用于控制堆栈的增长,因此您正在使用它们。
      • 我明白了,您来自 Windows 方面。无论如何,C语言没有例外,如果微软编造了一些东西但它不起作用,请否决微软。我说的是SIGSEGV,它是 POSIX,而不是 Microsoft。
      【解决方案5】:

      您可以使用宏来完成这项工作:

      #define NP_CHECK(ptr) \
          { \
              if (ptr == NULL) { \
                  fprintf(stderr, "%s:%d NULL POINTER: %s\n", \
                      __FILE__, __LINE__, #ptr); \
                  exit(-1); \
              } \
          } \
      

      【讨论】:

        猜你喜欢
        • 2021-04-04
        • 1970-01-01
        • 2020-09-14
        • 2015-03-20
        • 2022-07-06
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        相关资源
        最近更新 更多