繁体   English   中英

指向空数组的指针

[英]Pointer pointing to an empty array

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

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

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

    return ;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

你必须像这样使用它:

if(array == NULL) ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM