C 指向空数组的指针
我有一个指向数组开头的指针,但我需要检查它是否未分配。我想取消对指针的引用并检查是否为NULL,但这会导致类型错误。有人能看出我做错了什么吗C 指向空数组的指针,c,arrays,pointers,C,Arrays,Pointers,我有一个指向数组开头的指针,但我需要检查它是否未分配。我想取消对指针的引用并检查是否为NULL,但这会导致类型错误。有人能看出我做错了什么吗 int mydispose(int *array){ int i = 0; if(*array == NULL){ return 1; } return ; } 编辑:如果我不清楚,很抱歉:我有一个指向数组开头的指针,但我想检查数组是否为空 *数组==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:是的,没错。尤其是当/ifFoo
是几乎没有人需要做的事情时……谢谢,这是我最初的想法,但这不只是告诉我我有一个空指针吗,而不是指向空数组的指针?在C语言中没有空数组这种东西-当将数组传递给函数时,您应该始终传递一个指示长度的数字。如果该数字为零,则可以将数组视为空。然而,有一个空字符串的概念,因为按照惯例,字符串的结尾用零字符分隔。如果第一个字符是零字符,这被认为是一个空字符串。好的,谢谢BB,那么也许我应该测试零字符?我正在重写malloc(),“如果数组具有正确初始化的结构形式且当前没有分配的块,则此函数将返回1,否则它将返回0。”另一种保持数组长度的方法是采用字符串约定,但这并不总是适用的,因为“魔法”终止值也可以是有效的、有意义的值,这意味着始终至少分配一个元素。