此函数除了不接受0之外还可以正常工作,因为它认为它为NULL
void addtolist(int list[], int item){
for(int a=0;a<5;a++){
if(list[a]==NULL){
list[a]=item;
break;
}
}
}
有什么办法可以使数组接受零? 附加信息:-List-是一个简单的int数组,使用scanf
接受-item-输入答案 0 :(得分:-2)
否,无法区分list[a] == NULL
和list[a] == 0
。 list
无非就是一块内存,其中每4个字节被视为一个整数。
基本问题是您想要区分为空的元素和具有值的元素。有几种方法可以解决这个问题。
您可以将所有负数定义为“空”。或者,如果您需要负值,则可能只是一个值。 INT_MIN
是个不错的选择。
但是特殊值会导致错误,并且没有类型检查可以保存您,因此您需要专门初始化每个列表。有更好的方法。
代替存储整数,而是存储指向整数的指针。现在NULL
可以使用了。
int main() {
int **list = calloc(10, sizeof(int*));
int num = 42;
list[5] = #
for( size_t i = 0; i < 10; i++ ) {
int *entry = list[i];
if( entry == NULL ) {
continue;
}
printf("%d\n", *entry);
}
}
如果要存储指针,不利之处在于,因此必须记住要进行复制,以免改变原始内存。同样,现在NULL
也不能用作哨兵来指示数组的结尾。
真正的解决方案是更改数据结构以更好地匹配工作。如果您有一个完整的,有序的东西列表,可以很容易地用整数索引,那么数组就很好。如果列表不完整且带有空格,那么散列可能更合适。这是使用GLib's hash table的示例。
#include <stdio.h>
#include <glib.h>
// A little convenience function for inserting integers into a hash
// that normally wants pointers.
gboolean hash_table_insert_int(
GHashTable *table, int key, int value
) {
return g_hash_table_insert( table, GINT_TO_POINTER(key), GINT_TO_POINTER(value) );
}
int main() {
GHashTable *numbers = g_hash_table_new(g_direct_hash, g_direct_equal);
// Add 5 -> 42 and 9 -> 23
hash_table_insert_int( numbers, 5, 42 );
hash_table_insert_int( numbers, 9, 23 );
// Iterate through the entries in the table.
GHashTableIter iter;
gpointer key, value;
g_hash_table_iter_init(&iter, numbers);
while( g_hash_table_iter_next(&iter, &key, &value) ) {
printf("%d -> %d\n", (int)key, (int)value);
}
}
GLib的数据结构已经习惯了一些,因为它被设计为泛型类型,但是由于它们带来的强大灵活性而值得。现在,您有了一个数据结构,可以在不弄乱特殊值的情况下显式插入和删除条目,它知道其内存边界,并且内存和性能均有效。