如果数组未初始化,则该数组将获取垃圾值。要检查数组是否为NULL
,我们将在声明时使用NULL
或0
初始化数组。
如果用户为数组插入值0,则表示[1] = 0,并且他没有给出a[3]
的值,但a[1] = 0
a[3] = 0
。< / p>
不将数组初始化为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
),那么他怎么能真正知道该值是否已插入
答案 0 :(得分:1)
首先问题在于您似乎对NULL
和0
存在误解。在C NULL
中通常是数字0,但是适合任何类型的东西。因此,虽然您不应该依赖它,也不应该使用它,int i = NULL
与int i = 0
相同。这导致了一般问题:
对于指针,可以通过将它们设置为NULL
来轻松完成,因为有效指针将具有任何值,但为NULL 。对于普通类型(例如int
)执行此操作本身不可行,因为如果int
可以所有整数/ Z 您希望在哪里把你的&#34;特殊&#34;值?!这就是为什么经常使用指针而不是直接类型,或者在C ++中使用像boost optional这样更奇特的东西的原因。
所以你必须写下这样的东西:
#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
(&#34; stack&#34;)变量的地址时要谨慎,通常您必须使用dynamic
个变量,即使用malloc
和{ {1}}。