代码之家  ›  专栏  ›  技术社区  ›  Alex

指向空数组的指针

  •  9
  • Alex  · 技术社区  · 15 年前

    我有一个指针指向数组的开头,但我需要检查它是否未分配。我考虑取消对指针的引用并检查是否为空,但这会导致类型错误。有人知道我做错了什么吗?

    int mydispose(int *array){
        int i = 0;
    
        if(*array == NULL){
                return 1;
        }
    
        return ;
    

    }

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

    6 回复  |  直到 15 年前
        1
  •  11
  •   Blagovest Buyukliev    15 年前

    *array == NULL 是错误的。您首先取消对指针的引用(如果指针确实为空,则可能导致segfault),然后将其int值与指针值进行比较。此外,如果 NULL 被定义为 0 而不是 (void *) 0 .

    你应该检查一下 array == NULL 查看传递的指针是否引用了任何内容,然后只在不引用的情况下取消引用 无效的 .

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

        2
  •  5
  •   Jerry Coffin    15 年前

    你想要的 if (array == NULL) --但除非你先初始化 array NULL 也不会有什么好处。我认为你最好是支持我们,多告诉我们一点你正在努力实现的目标,并试图获得帮助来实现你的总体目标。

        3
  •  1
  •   Yann Ramin    15 年前

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

    1. 确保 *数组 设置为空则不分配。 int *array = NULL;
    2. 检查数组是否为空: if (array == NULL) return -1;
        4
  •  1
  •   Vlad    15 年前

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

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

    顺便说一下,空数组(即大小为0的数组)和根本没有分配的数组之间存在差异。第一个选项出现在使用 malloc(0) ,当指针完全未初始化时的第二个。为了 马尔洛克(0) 可以回去了 无效的 ,但也允许返回非空指针(但不能取消引用)。两种方式均按标准有效。

        5
  •  1
  •   John Bode    15 年前

    您的代码的直接问题是您取消引用 array 在将其与空值进行比较之前。的类型 表达 *array int 不是 int * . 不使用取消引用运算符,类型将匹配:

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

    请注意,只有使用静态范围声明未初始化的指针(即,它是在文件范围或使用 static 前面有关键字)。同样,呼叫 free 在指针上,不会将该指针值设置为空;它将包含与以前相同的指针值,但现在将无效。

        6
  •  0
  •   Liviu Mandras    15 年前

    您必须这样使用它:

    if(array == NULL) ...