代码之家  ›  专栏  ›  技术社区  ›  pop850

如何在c中检查“set”

  •  6
  • pop850  · 技术社区  · 16 年前

    如果我像这样分配一个C数组:

    int array[ 5 ];
    

    然后,只设置一个对象:

    array[ 0 ] = 7;
    

    我怎样才能检查其他所有的钥匙( array[1] array[2] ,)正在存储值?(在这种情况下,他们当然不是。)

    有没有像PHP那样的函数 isset()

    if ( isset(array[ 1 ]) ) ...
    
    6 回复  |  直到 16 年前
        1
  •  7
  •   alex    16 年前

    在C中没有这样的东西。静态数组的内容总是“set”。但是,您可以填充一些特殊值来假装它未初始化,例如。

    // make sure this value isn't really used.
    #define UNINITIALIZED 0xcdcdcdcd
    
    int array[5] = {UNINITIALIZED, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED, UNINITIALIZED};
    
    array[0] = 7;
    
    if (array[1] != UNINITIALIZED) {
       ...
    
        2
  •  6
  •   Loki Astari    16 年前

    这些值都是未定义的(因此是随机的)。

    您可以显式地将所有值归零,以便至少有一个好的起点。但是使用幻数来检测对象是否已经初始化被认为是不好的做法(但是初始化变量被认为是好的做法)。

    int array[ 5 ] = {};
    

    但是,如果您想显式地检查它们是否在创建之后被显式地设置(不使用幻数),您需要将该信息存储在另一个结构中。

    int array[ 5 ]   = {};  // Init all to 0
    int isSet[ 5 ]   = {};  // Init all to 0 (false)
    
    int getVal(int index)          {return array[index];}
    int isSet(int index)           {return isSet[index];}
    void setVal(int index,int val) {array[index] = val; isSet[index] = 1; }
    
        3
  •  2
  •   BiGYaN    16 年前

    但是,您可以在默认情况下使用memset()用一些标准值(如0或INT\ MIN)填充它,然后编写isset()代码。

        4
  •  2
  •   dmckee --- ex-moderator kitten    16 年前

    • php数组实际上是一个散列映射(awk就是这么做的)

    一些 任何时候都在每个单元格中显示值。如果数组未初始化并且是自动的,或者是在堆上分配的,那么这些值可能是随机的,但它们是存在的。

    • 实现(或找到一个库)并在数组上使用hashmap。
    • 将数组初始化为所有单元格中的某个sentinal值。
        5
  •  1
  •   Matthew Mitchell    16 年前

    一种解决方案可能是使用单独的标志数组。指定其中一个元素时,请在布尔数组中设置标志。

    也可以使用指针。可以使用空指针来表示尚未分配的数据。我举了一个例子:

    int * p_array[3] = {NULL,NULL,NULL};
            p_array[0] = malloc(sizeof(int));
            *p_array[0] = (int)0;
            p_array[2] = malloc(sizeof(int));
            *p_array[2] = (int)4;
            for (int x = 0; x < 3; x++) {
                if (p_array[x] != NULL) {
                    printf("Element at %i is assigned and the value is %i\n",x,*p_array[x]);
                }else{
                    printf("Element at %i is not assigned.\n",x);
                }
            }
    

    您可以创建一个分配内存和设置数据的函数,以及另一个类似于PHP中isset函数的函数,方法是为您测试NULL。

    编辑:确保完成后释放内存。另一个函数可用于取消分配某些元素或整个数组。

    我以前使用过空指针来表示数据尚未创建或需要重新创建。

        6
  •  1
  •   R.. GitHub STOP HELPING ICE    16 年前

    我喜欢的一种方法是创建两个数组,一个是位数组,表示设置了数组的哪些索引,另一个包含实际值。即使在不需要知道数组中某个项是否“已设置”的情况下,它也可以是一个有用的优化。将每元素1位的位数组归零要比初始化每元素8字节的数组快得多 size_t ,尤其是如果数组在其整个生存期内保持稀疏(大部分为未填充)。

    我使用这个技巧的一个实际例子是在一个子串搜索函数中,使用一个Boyer-Moore风格的坏字符跳过表。该表需要256个类型的条目 大小\u t ,但只需要填充实际出现在针串中的字符对应的字符。1kb(或64位上的2kb) memset 在很短的搜索时间内,它将主导cpu的使用,导致其他实现在是否使用表的问题上抛出启发式算法。但是,我没有初始化skip表,而是使用了一个256位的数组(只有32个字节可供输入) )标记正在使用的条目。

    推荐文章