指向空数组的指针

时间:2010-11-08 16:13:20

标签: c arrays pointers

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

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

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

    return ;

}

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

6 个答案:

答案 0 :(得分:11)

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

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

但请注意,取消引用非空指针也不能保证安全操作。如果指针包含一个垃圾值,因为它是在堆栈上分配而没有初始化,或者如果它引用了一个解除分配的内存区域,那么就会发生令人讨厌的错误。

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

顺便说一句,空数组(即大小为0的数组)和根本没有分配的数组之间存在差异。第一个选项发生在使用malloc(0)时,第二个选项在指针未完全初始化时发生。对于malloc(0),允许返回NULL,但允许返回非NULL指针(但是您无法取消引用)。两种方式都符合标准。

答案 4 :(得分:1)

您的代码的直接问题是您在将其与NULL进行比较之前解除引用array表达式 *array的类型为int,而非int *。不要取消引用操作符,类型将匹配:

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

请注意,如果未初始化的指针是使用静态范围声明的(即,它是在文件范围内声明或在其前面使用static关键字),则仅保证包含NULL。类似地,在指针上调用free不会将该指针值设置为NULL;它将包含与以前相同的指针值,但现在它将无效。

答案 5 :(得分:0)

你必须像这样使用它:

if(array == NULL) ...