设置用于索引的数组更新变量的值

时间:2016-02-29 18:06:33

标签: c

当我更新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;
}

3 个答案:

答案 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;