当我更新C struct
中数组的值时,有时但很少用作索引的int
的值也会更新(int
也来自{{ 1}})。这里有关于作业的遗漏吗?
struct
例如,如果我添加一些代码来添加以捕获偶尔抛出的错误,即
struct Set {
int data[STARTING_SET_SIZE];
int count;
int capacity;
};
#define STARTING_SET_SIZE 10
struct Set *constructSet()
{
struct Set *set = malloc(sizeof(int) * 2 + STARTING_SET_SIZE * sizeof(int));
set->count = 0;
set->capacity = STARTING_SET_SIZE;
return set;
}
bool full(struct Set *set)
{
return set->count == STARTING_SET_SIZE;
}
void grow(struct Set *set)
{
set = realloc(set, sizeof(int) * 2 + 2 * set->capacity * sizeof(int));
set->capacity = set->capacity * 2;
}
void add(struct Set *set, int input)
{
if (full(set)) grow(set)
set->data[set->count] = input;
set->count += 1;
}
如果我在JAVA中编写此代码,我将永远不会在add()函数的前三行中看到计数更改,但我在C中还有其他内容吗?
下面是最初向我显示错误的测试脚本。
void add(struct Set *set, int input)
{
int previousCount = set->count;
set->data[set->count] = input;
if (previousCount != set->count) {
exit(1);
}
set->count += 1;
}
答案 0 :(得分:2)
您的结构设计不正确。您希望固定部分是第一个,可变部分是最后一个。
由于数组是可变的,因此将其大小设置为0。
struct Set {
int count;
int capacity;
int data[0];
};
这样,当你重新分配结构时,数量和容量都不会移动。
答案 1 :(得分:1)
您的grow
功能写得不好。你需要传递双指针。如果新重新分配的内存在不同的地址上启动,则无法从函数中将其传回。
答案 2 :(得分:0)
函数full
只能运行一次。
bool full(struct Set *set)
{
return set->count == STARTING_SET_SIZE;
}
在你成长一次结构后,它将永远失败。我建议
bool full(struct Set *set)
{
return set->count >= set->capacity;
}
我还建议不要每次都增加一倍的容量,这会使内存变得贪婪。我建议添加固定金额,例如
set->capacity += STARTING_SET_SIZE;