我有一个指向数组开头的指针,但我需要检查它是否未分配。我想到取消引用指针并检查是否为NULL,但这会导致类型错误。谁能看到我做错了什么?
int mydispose(int *array){
int i = 0;
if(*array == NULL){
return 1;
}
return ;
}
编辑:对不起,如果我不清楚:我有一个指向数组开头的指针,但我希望检查数组是否为空。答案 0 :(得分:11)
*array == NULL
错了。您首先取消引用指针(如果指针确实为null,则可能导致段错误),然后将其int值与指针值进行比较。此外,如果NULL
被定义为0
而非(void *) 0
,则编译器将完全接受该错误表达。
您应该检查array == NULL
以查看传递的指针是否引用任何内容,然后仅在不是NULL
的情况下取消引用它。
但请注意,取消引用非空指针也不能保证安全操作。如果指针包含一个垃圾值,因为它是在堆栈上分配而没有初始化,或者如果它引用了一个解除分配的内存区域,那么就会发生令人讨厌的错误。
答案 1 :(得分:5)
您想要if (array == NULL)
- 但除非您先将array
初始化为NULL
,否则它也不会有任何好处。我认为你最好还是备份并告诉我们更多关于你想要完成什么的事情,并试图获得帮助以实现你的总体目标。
答案 2 :(得分:1)
确定*array
分配状态的唯一安全方法是:
*array
设置为NULL。 int *array = 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) ...