C 指向空数组的指针

C 指向空数组的指针,c,arrays,pointers,C,Arrays,Pointers,我有一个指向数组开头的指针,但我需要检查它是否未分配。我想取消对指针的引用并检查是否为NULL,但这会导致类型错误。有人能看出我做错了什么吗 int mydispose(int *array){ int i = 0; if(*array == NULL){ return 1; } return ; } 编辑:如果我不清楚,很抱歉:我有一个指向数组开头的指针,但我想检查数组是否为空 *数组==NULL错误。首先解除对指针的引用(如果指针

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

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

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

    return ;
}


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

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

您应该检查
array==NULL
以查看传递的指针是否引用了任何内容,然后只有在它不是
NULL
时才取消引用它


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

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

你必须这样使用它:

if(array == NULL) ...

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

  • 确保未分配
    *数组
    设置为NULL<代码>整数*数组=空
  • 检查数组是否为空:
    if(array==NULL)返回-1

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

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


    顺便说一下,空数组(即大小为0的数组)和根本未分配的数组之间存在差异。第一个选项出现在使用
    malloc(0)
    时,第二个选项出现在指针未初始化时。对于
    malloc(0)
    可以返回
    NULL
    ,但也可以返回非NULL指针(但不能取消引用)。根据标准,这两种方法都是有效的。

    代码的直接问题是,在将数组与空值进行比较之前,先取消对数组的引用。表达式
    *数组
    的类型是
    int
    ,而不是
    int*
    。取消引用运算符,类型将匹配:

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

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

    -1?这个问题显示出缺乏理解,但这就是提问的全部意义所在。代码已格式化,问题很清楚。如果你要投某人的反对票,至少要说出原因。“…我知道我需要做Foo,但不明白如何做…”通常是一个信号,表明你不需要做Foo,但完全是另外一件事。@dmckee:是的,没错。尤其是当/if
    Foo
    是几乎没有人需要做的事情时……谢谢,这是我最初的想法,但这不只是告诉我我有一个空指针吗,而不是指向空数组的指针?在C语言中没有空数组这种东西-当将数组传递给函数时,您应该始终传递一个指示长度的数字。如果该数字为零,则可以将数组视为空。然而,有一个空字符串的概念,因为按照惯例,字符串的结尾用零字符分隔。如果第一个字符是零字符,这被认为是一个空字符串。好的,谢谢BB,那么也许我应该测试零字符?我正在重写malloc(),“如果数组具有正确初始化的结构形式且当前没有分配的块,则此函数将返回1,否则它将返回0。”另一种保持数组长度的方法是采用字符串约定,但这并不总是适用的,因为“魔法”终止值也可以是有效的、有意义的值,这意味着始终至少分配一个元素。