【问题标题】:Pointer pointing to an empty array指向空数组的指针
【发布时间】:2010-11-08 16:13:20
【问题描述】:

我有一个指向数组开头的指针,但我需要检查它是否未分配。我想过取消引用指针并检查是否为 NULL 但这会导致类型错误。谁能看到我做错了什么?

int mydispose(int *array){
    int i = 0;

    if(*array == NULL){
            return 1;
    }

    return ;

}

编辑:对不起,如果我不清楚:我有一个指向数组开头的指针,但我想检查数组是否为空。

【问题讨论】:

  • -1?这个问题表明缺乏理解,但这就是提问的全部意义所在。代码已格式化,问题很清楚。如果您要对某人投反对票,请至少说明原因。

标签: c arrays pointers


【解决方案1】:

*array == NULL 是错误的。您首先取消引用指针(如果指针确实为空,则可能导致段错误),然后将其 int 值与指针值进行比较。此外,如果 NULL 仅定义为 0 而不是 (void *) 0,您的编译器将完全接受该错误表达式。

您应该检查 array == NULL 以查看传递的指针是否引用任何内容,然后仅在它不是 NULL 的情况下取消引用它。

但是请注意,取消引用非空指针也不能保证是安全操作。如果指针包含垃圾值,因为它是在堆栈上分配但未初始化,或者如果它引用了已释放的内存区域,则可能会发生讨厌的错误。

【讨论】:

  • 谢谢,这是我最初的想法,但这不只是告诉我我有一个空指针,而不是一个指向空数组的指针吗?
  • C 中没有空数组这样的东西——当将数组传递给函数时,您应该始终传递一个指示长度的数字。如果该数字为零,则可以将数组视为空。然而,有一个空字符串的概念,因为按照惯例,字符串在末尾用零字符分隔。如果第一个字符是零字符,则认为是空字符串。
  • 好的,谢谢 BB,所以也许我应该测试零字符?我正在重写 malloc(),“如果数组具有正确初始化的结构且当前没有分配的块,则此函数将返回 1,否则它将返回 0。”
  • 单独保留数组长度的替代方法是采用字符串约定,但这并不总是适用,因为“神奇”终止值也可能是一个有效的、有意义的值,这意味着总是分配至少一个元素。
【解决方案2】:

你想要if (array == NULL)——但除非你首先将array初始化为NULL,否则它也不会有任何好处。我认为你最好备份并告诉我们更多关于你想要完成的事情,并尝试获得帮助以实现你的总体目标。

【讨论】:

  • 这个。 "...我知道我需要做 Foo,但不明白如何..." 通常表示您不需要 需要做 Foo,但完全不同。
  • @dmckee:是的,完全正确。当/如果Foo 是几乎没有人需要做的事情时,这种情况尤其可能......
【解决方案3】:

确定*array 分配状态的唯一安全方法是:

  1. 确保 *array 设置为 NULL 未分配。 int *array = NULL;
  2. 检查数组是否为NULL:if (array == NULL) return -1;

【讨论】:

    【解决方案4】:

    您无法可靠地检查是否分配了某个内存位置。 *array 不是有效代码,因为它与 array[0] 相同,但未分配 array[0]。未分配的内存位置可以包含任何值。

    唯一的选择是确保您获得有关该数组是否与您的数组一起分配的信息。一个流行的选项是将未分配的数组表示为NULL,但您也可以选择其他选项。

    顺便说一下,空数组(即大小为 0 的数组)和根本没有分配的数组是有区别的。第一个选项发生在您使用malloc(0) 时,第二个选项发生在您的指针根本没有初始化时。对于malloc(0),它允许返回NULL,但它也允许返回一个非NULL 指针(但是你不能取消引用)。根据标准,这两种方式都有效。

    【讨论】:

      【解决方案5】:

      您的代码的直接问题是您在将 array 与 NULL 进行比较之前取消引用它。 表达式 *array 的类型是int,而不是int *。去掉取消引用运算符,类型将匹配:

      if (array == NULL) {...}
      

      请注意,未初始化的指针只有在使用静态范围声明时才能保证包含 NULL(即,它要么在文件范围内声明,要么在其前面使用 static 关键字声明)。同样,在指针上调用 free 不会将该指针值设置为 NULL;它将包含与以前相同的指针值,但现在将无效。

      【讨论】:

        【解决方案6】:

        你必须像这样使用它:

        if(array == NULL) ...
        

        【讨论】:

          猜你喜欢
          • 2015-04-28
          • 2021-02-07
          • 2016-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多