c - 检查数组值是否为 NULL,即是否已设置

标签 c arrays null

如果未初始化,数组将采用垃圾值。要检查数组是否为 NULL,我们将在声明时使用 NULL0 来初始化数组。

如果用户为数组插入值 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]有一些垃圾值。

将数组初始化为NULL0

#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)那么他如何才能真正知道值是否插入

最佳答案

第一个问题是您似乎对 NULL0 有误解。在 C 中,NULL 通常是数字 0,但可以适合任何类型。因此,尽管您不应该依赖它,也不应该使用它,但 int i = NULLint 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/

相关文章:

java - 与 Guava 的Optional<T> 一起,Mandatory<T> 会是一个有用的补充吗?

Java Map 为当前键返回 null

c++ - C/C++ 中的语法糖

c++ - 类 CSV 格式的 C 库支持多个 "tables"和“命名引用

c++ - 声明一个字符串数组并查找其中的元素数 (openFrameworks)

javascript - 将 undefined 赋值给已声明但未初始化的变量?

c - 根据每个元素的频率对数组元素进行排序

c - fork多线程进程,为线程分配内存

arrays - 在其 didSet 中过滤数组

arrays - Swift3 错误 : Binary operator '<' cannot be applied to two 'ArraySlice<Int>' operands