【问题标题】:How to know whether an array is initialized in C如何知道数组是否在C中初始化
【发布时间】:2011-11-26 23:47:10
【问题描述】:

如何知道数组是否在 C 中初始化? strlen() 之类的函数对我没有帮助,因为我不想知道数组是否为空。

【问题讨论】:

    标签: c arrays null strlen


    【解决方案1】:

    没有办法在运行时测试它——一个未初始化的数组看起来就像一个用垃圾初始化的数组。

    根据您正在执行的操作,您需要要么 来确保数组实际上已初始化 显式传递一个标志,告诉您是否在数组还有意义。

    另外请注意,“数组是否为空”在 C 中并不是一个非常有意义的概念。数组只是那里,它总是包含任意数量的位是表示它声明的元素所必需的。这些位可能没有有意义的值,但它们总是存在的。

    【讨论】:

    • 从技术上讲,这是未定义的行为,不一定是垃圾值。此外,在 C 标准中有一个定义明确的概念,称为“不确定值”。尽管您所说的在某些 C 实现中可能是正确的,但它与语言的抽象级别并不真正相关;数组在内存中的表示方式(如果有的话)只是一个实现细节。
    • 是的,但这并不能完全帮助 OP。
    • @Mehrdad:你是对的,但“不确定值”在程序中是无法测试的。
    • @R.. 因此是评论,而不是答案:)
    • 与问题无关,但对研究部门有帮助。回答和评论都有很大帮助。答案有助于核心解决方案,评论有助于进一步研究Inderterminate vlaue
    【解决方案2】:

    您不能使用编程语言功能。

    但你可以通过设计和纪律。在声明时将您的数组设置为指向 NULL 的指针。 然后创建一个函数来为您的指针分配内存和值,并在不再需要时创建一个相应的释放函数来销毁它,再次将其设置为 NULL。然后让每个处理函数检查 NULL 作为错误条件。

    要进行边界识别,请将最后一个元素设置为 NULL。

    例子:

    char* myArray=NULL;
    
    /* other code */
    
    myArray = createMyArray(n_elements);
    memset(myArray,0,sizeof(int)*n_elements); /* Set the allocated memory to zero */
    
    /* other code */
    
    myArray[0]=functionReturningAString();
    myArray[n_elements-1]=functionReturningAnotherString();
    
    /* other code */
    
    /*Processing*/
    char* incr=myArray;
    while( incr != NULL){
       processArray(incr);
       incr++;/* Increments by size of char pointer to the next pointer*/
    }
    free_Array(&myArray);/* this function calls free() and sets myArray to NULL*/
    

    当您需要大量效率时,这是可用的。否则,您应该创建自己的数组列表或使用提供它的现有库。

    你需要太多的纪律来跟踪每一个可能的错误情况,所以这可能很烦人。

    通常最好只使用提供arraylist、linkedlist、HashSets等的库。对于C,我使用了很多Glib函数。

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多