如果未初始化,数组将采用垃圾值。要检查数组是否为 NULL
,我们将在声明时使用 NULL
或 0
来初始化数组。
如果用户为数组插入值 0,例如 a[1]=0,并且他没有给出 a[3]
的值,但 a[1] = 0
a[3] = 0
。
没有将数组初始化为NULL
#include <stdio.h>
main(){
int i, a[5];
a[0] = 0;
a[1] = 2;
a[3] = 4;
a[4] = 5;
for (i = 0 ; i < 5 ; i++){
printf("%d ", a[i]);
}
}
这里a[2]
有一些垃圾值。
将数组初始化为NULL
或0
#include <stdio.h>
main() {
int i, a[5] = {0};
a[0] = 0;
a[1] = 2;
a[3] = 4;
a[4] = 5;
for (i = 0 ; i <5 ; i++) {
printf("%d ", a[i]);
}
}
这里没有插入a[2]
,但它的值为0
如果用户的输入是 0
(这里a[0] = 0
)那么他如何才能真正知道值是否插入
最佳答案
第一个问题是您似乎对 NULL
和 0
有误解。在 C 中,NULL
通常是数字 0,但可以适合任何类型。因此,尽管您不应该依赖它,也不应该使用它,但 int i = NULL
与 int i = 0
相同。这导致了普遍的问题:
“NULL”/“OPTIONAL”/“NIL”/“NOT_SET”值的约定
对于指针,这可以通过将它们设置为NULL
来轻松完成,因为有效的指针将具有任何值,但NULL。对于普通类型(例如 int)执行此操作本身是不可能的,因为如果 int
可以是所有整数/Z 你想把你的“非凡”值(value)放在哪里?!这就是为什么经常使用指针而不是直接类型,或者使用一些更奇特的东西,例如 boost optional在 C++ 中。
所以你必须写这样的东西:
#include <stdlib.h>
#include <stdio.h>
#define ARRAY_SIZE 5
int main (void)
{
int number = 42;
int *array[ARRAY_SIZE] = {0};
array [2] = &number;
int i;
for (i = 0; i < ARRAY_SIZE; i++){
if (array[i] != NULL){
printf("Position %d was set to %d\n",i,*array[i]);
}
}
return 0;
}
但是,在使用auto
(“堆栈”)变量的地址时要小心,通常您必须使用动态
变量,即使用malloc
和免费
。
关于c - 检查数组值是否为 NULL,即是否已设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32758864/