[英]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
分配状态的唯一安全方法是:
*array
设置为NULL。 int *array = 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.