是什么导致我的数组充满不需要的数字
What's causing my array to be filled with unwanted numbers
我正在尝试使用动态数组实现一组 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)增加了一倍。任何想法是什么导致阵列的其余部分被填充?这只是代码的一小部分,所以如果这里似乎没有什么原因,我可以 post 更多。
=== 添加信息:===
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 列表。
在函数 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
我们来看realloc()的定义:从region的开始到新旧大小的最小值,内容不变。如果新大小大于旧大小,添加的内存不会被初始化。
所以我相信你不应该使用 if (iter->set->array[iter->cur] == NULL) in set_hasnext(set_iter_t *iter) 因为你没有初始化 re - 将数组分配给 NULL。换句话说,数组中的值可能是随机的。
解决我的问题的两个更改:
在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。
我正在尝试使用动态数组实现一组 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)增加了一倍。任何想法是什么导致阵列的其余部分被填充?这只是代码的一小部分,所以如果这里似乎没有什么原因,我可以 post 更多。
=== 添加信息:===
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 列表。
在函数 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
我们来看realloc()的定义:从region的开始到新旧大小的最小值,内容不变。如果新大小大于旧大小,添加的内存不会被初始化。 所以我相信你不应该使用 if (iter->set->array[iter->cur] == NULL) in set_hasnext(set_iter_t *iter) 因为你没有初始化 re - 将数组分配给 NULL。换句话说,数组中的值可能是随机的。
解决我的问题的两个更改:
在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。