如何在C中检查已分配数组中的空字段



我有一个分配的数组,需要遍历所有字段并比较非null值。这个数组中的值也可以是0,这给我带来了一些麻烦

int size = 4;
int *numbers = (int*) malloc(size * 4);
// Fill some fields
numbers[0] = 3;
numbers[1] = 0;
numbers[2] = 6;
// Search and find min value's index
int min = 0;
for (int i = 0; i < size; i++) {
if (numbers[i] != NULL) {
if (numbers[i] < numbers[min]) min = i;
} else {
// Code if value is null here
}
}
printf("%dn", min);

我不知道如何正确地与NULL进行比较。正确的方法是什么?

您的整体设计有缺陷。您不应该将NULL视为一个包罗万象的零值。NULL是一个特殊的指针值,而不仅仅是一个整数。如果将intNULL进行比较,则会比较两种不同的类型,这不是一个好主意。此外,您正在比较标量类型和指针类型,这更糟。

这个数组中的值也可以是0,这给我带来了一些麻烦。

如果是这种情况,则不能将0同时用作值和";标记";对于";非现值";。问题是,您也不能使用NULL,因为它是不同的类型。如果您尝试使用它,编译器将向您发出警告(如果您启用警告,则至少应该发出警告(。分配NULL最多会将其隐式转换为int,并产生0,因为NULL通常定义为((void *)0),因此无法区分NULL值和有效值。

为此,您必须保留INT_MININT_MAX之间的一个值:

#include <limits.h>
enum { NOT_PRESENT = INT_MIN };
int size = 4;
int *numbers = malloc(size * sizeof(int));
// Initialize all to NOT_PRESENT
for (int i = 0; i < size; i++)
numbers[i] = NOT_PRESENT;
// Fill some fields
numbers[0] = 3;
numbers[1] = 0;
numbers[2] = 6;
// Search and find min value's index
int min = 0;
for (int i = 0; i < size; i++) {
if (numbers[i] != NOT_PRESENT) {
if (numbers[i] < numbers[min]) min = i;
} else {
// Code if value is not present here
}
}
printf("%dn", min);

您分配的数组元素永远不会为NULL。即使使用free函数释放的内存也不是NULL。IT可以指向任何东西,可以是任何您自己的程序地址空间或外部地址空间。

Ur代码看起来不错。u没有分配给索引3中元素的值可能有垃圾,但不能为NULL

相关内容

  • 没有找到相关文章

最新更新