gpt4 book ai didi

c - 如何在 C 中使 0 成为 int 数组的一部分?

转载 作者:行者123 更新时间:2023-11-30 18:14:50 25 4
gpt4 key购买 nike

除了不接受 0 之外,该函数工作得很好,因为它认为 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- 输入

最佳答案

不,没有办法区分 list[a] == NULLlist[a] == 0list只不过是一个内存块,其中每 4 个字节被视为一个整数。

基本问题是您想要区分空元素和具有值的元素。有几种方法可以解决这个问题。

使用特殊整数。

您可以将所有负数定义为“空”。或者,如果您需要负值,也许只需要一个值。 INT_MIN 是一个不错的选择。

但是特殊值会导致错误,并且没有类型检查来拯救您,并且您需要专门初始化每个列表。还有更好的方法。

使用整数指针。

不存储整数,而是存储指向整数的指针。现在 NULL 可以工作了。

int main() {
int **list = calloc(10, sizeof(int*));
int num = 42;
list[5] = &num;

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 的数据结构需要一些时间来适应,因为它被设计为通用类型,但由于它们带来的强大灵 active ,这是值得的。现在您有了一个数据结构,您可以显式插入和删除条目,而无需弄乱特殊值,它知道其内存边界,并且内存和性能高效。

关于c - 如何在 C 中使 0 成为 int 数组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com