所以我的C程序中有一个数组
Node *array;
array = (Node*)malloc(53*sizeof(Node));
if(array[5] is empty)
//Fill array index with element
如何测试元素是否存在?我试过if(array [5] == NULL)但它一直给我一个错误。
答案 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]