是什么导致我的阵列充满了不需要的数字

问题描述 投票:0回答:3

我正在尝试使用动态数组实现set ADT。我有一组奇数和偶数。当数组已满时,我使用realloc来获得更大的数组。问题是,这似乎也填补了不需要的数字。

struct set
{
    void **array;
    int numitems;
    int maxitems;
    cmpfunc_t cmpfunc;
};

.

void set_add(set_t *set, void *elem)
{
    if (!set_contains(set, elem))
    {
        if (set->numitems + 1 >= set->maxitems) // Make new bigger array if full
        {
            void **new_array = realloc(set->array, sizeof(void *) * set->maxitems * 2);
            if (new_array == NULL)
                printf("Error");
            set->maxitems *= 2;
            set->array = new_array;
        }
        set->array[set->numitems] = elem;
        set->numitems++;
    }
}

在主要我使用它来添加数字。

for (i = 0; i <= n; i++) {
    if (i % 2 == 0)
        set_add(evens, numbers[i]);
    else
    {
        printset("Odd numbers":, odds);
        set_add(odds, numbers[i]);
    }
}

这是我得到的输出。

输出:

  • 奇数:1
  • 奇数:1 3
  • 奇数:1 3 5

...

  • 奇数:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29
  • 奇数:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
  • 奇数:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 17 18 19 20 21 22 23 24 25 26 27 28 29 30
  • 奇数:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 18 19 20 21 22 23 24 25 26 27 28 29 30

...

添加31后,数组maxsize(= 16)加倍。是什么原因导致数组的其余部分被填充?这只是代码的一小部分,所以如果这里似乎没有什么似乎是我可以发布更多的原因。

===添加信息:===

static void printset(char *prefix, set_t *set)
{
    set_iter_t *it;

    printf("%s", prefix);
    it = set_createiter(set);
    while (set_hasnext(it)) {
        int *p = set_next(it);
        printf(" %d", *p);
    }
    printf("\n");
    set_destroyiter(it);
}

.

set_iter_t *set_createiter(set_t *set)
{
    set_iter_t *iter = malloc(sizeof(set_iter_t));
    if (iter == NULL)
        return NULL;
    bobsort(set);
    iter->set = set;
    iter->cur = 0;

    return iter;
}

int set_hasnext(set_iter_t *iter)
{
    if (iter->set->array[iter->cur] == NULL)
        return 0;
    else
        return 1;
}

void *set_next(set_iter_t *iter)
{
    if (iter->set->array[iter->cur] == NULL)
        return NULL;
    else
    {
        void *elem = iter->set->array[iter->cur];
        iter->cur++;
        return elem;
    }
}

这是一个作业,所以我遵循功能签名。我习惯用链表制作adt列表而不是数组。

c arrays adt realloc
3个回答
0
投票

在功能set_add你应该改变if条件:

 if (set->numitems + 1 >= set->maxitems) // Make new bigger array if full

if (set->numitems  >= set->maxitems) // Make new bigger array if full

0
投票

让我们看看realloc()的定义:内容将在从区域的开始到旧的和新的大小的最小值的范围内保持不变。如果新大小大于旧大小,则不会初始化添加的内存。所以我相信你不应该在set_hasnext(set_iter_t * iter)中使用if(iter-> set-> array [iter-> cur] == NULL),因为你没有将重新分配数组初始化为NULL。换句话说,数组中的值可能是随机的。


0
投票

解决我的问题的两个变化是:

在add_set()中,更改

if (set->numitems + 1 >= set->maxitems)

if (set->numitems  >= set->maxitems)

在set_hasnext()中,更改

if (iter->set->array[iter->cur] == NULL)

if (iter->cur >= iter->set->numitems)

感谢Tran和Anthony。

© www.soinside.com 2019 - 2024. All rights reserved.