我怎么知道数组中的元素是否存在?

时间:2015-11-29 23:48:33

标签: c arrays malloc

所以我的C程序中有一个数组

Node *array;
array = (Node*)malloc(53*sizeof(Node));

if(array[5] is empty)
 //Fill array index with element

如何测试元素是否存在?我试过if(array [5] == NULL)但它一直给我一个错误。

4 个答案:

答案 0 :(得分:1)

  

我已尝试if(array[5] == NULL),但它一直给我一个错误。

这不起作用有两个原因:

  • malloc未初始化返回给您程序的内存。您负责将内存设置为零,
  • Node不是指针类型,因此在不知道Node本身的结构的情况下,您不知道Node是否有效

您可以切换到双指针Node **array,并像这样分配:

array = (Node**)malloc(53*sizeof(Node*));
memset(array, 0, 53*sizeof(Node*));

但是,这意味着您必须array作为一个指针数组,其中包含malloc个单独的元素,依此类推。

如果您想要一个Node结构数组,请使用一个单独的标记数组来指示是否使用了特定元素。

答案 1 :(得分:1)

数组中的所有元素都存在。无法检查元素是否存在,因为元素不能存在。

如果你想要一个“不存在的元素”的概念,你必须自己做。实现这一点的直接方法是在Node中有一个字段,用于存储节点是否“存在”。在分配它们之后,您在每个Node中将该字段设置为false,并且只要您希望节点“存在”,就将其设置为true。

答案 2 :(得分:0)

您可以使用sentinel值(例如零)初始化内存,然后检查array[5]是否仅包含该值。 E.g:

#define UNINITIALIZED 0

Node *array = calloc(53, sizeof(Node)); // don't cast malloc and friends!
Node null_node;
memset(&null_node, UNINITIALIZED, sizeof(Node));

if(memcmp(&array[5], &null_node, sizeof(Node)) == 0)
    // …

确保有效的Node实例永远不会等于该哨兵值。

这比dasblinkenlight的解决方案更有效,因为它涉及额外的间接。但是,如果找不到安全的标记值,并且无法向int uninitialized添加Node(或类似)标志字段,则必须使用额外指针,除非您存储有关哪些元素的信息在其他地方初始化。

答案 3 :(得分:0)

我个人认为在这种情况下使用c ++会更好,因为那时你可以使用默认的构造函数进行初始化。 在您的情况下,如果您想检查Node是否已初始化'或者,只需执行calloc,然后检查某个整数变量的值。

struct Node {
   //set to 1 if not empty
   char emptyFlag;
   initialize() {

        emptyFlag = 1;

        //other stuff 
   }
}

Node *array;
array = (Node*)calloc(53 , sizeof(Node));

if(array[5].emptyFlag == 0)
 //initialize array[5]