由于数组大小是静态的,我的想法是使用这样的指针:
理论上,解决方案似乎很容易......但我是c的菜鸟。哪里错了?
struct task {
char title[50];
int execution;
int priority;
};
struct task tasks = *p;
int main() {
//he will call the increaseSize() somewhere...
}
void increaseSize(){
int dimension = (sizeof(*p) / sizeof(struct task));
struct task newTasks[dimension+1];
for(int i=0; i<dimension; i++){
newTasks[i] = *(p+i);
}
free(&p);
p = newTasks;
}
答案 0 :(得分:1)
你在这里混淆了很多!
int dimension = (sizeof(*p) / sizeof(struct task));
p
是一个指针,*p
指向struct task
,因此sizeof(*p)
将等于sizeof(struct task)
,维度始终为1 ..
在这种情况下你不能使用sizeof。您必须将大小(元素数量)存储在单独的变量中。
struct task newTasks[dimension+1];
这将创建一个新数组,是 - 但是当前函数的范围是本地的(通常,它在堆栈上分配)。这意味着一旦你离开你的功能就会再次清理阵列。
您需要在堆上创建数组。您需要使用malloc函数(或calloc或realloc)。
此外,我建议不要将数组增加1,而是重复其大小。但是,您也需要存储当时包含的元素数量。
全部放在一起:
struct task* p;
size_t count;
size_t capacity;
void initialize()
{
count = 0;
capacity = 16;
p = (struct task*) malloc(capacity * sizeof(struct task));
if(!p)
// malloc failed, appropriate error handling!
}
void increase()
{
size_t c = capacity * 2;
// realloc is very convenient here:
// if allocation is successful, it copies the old values
// to the new location and frees the old memory, so nothing
// so nothing to worry about except for allocation failure
struct task* pp = realloc(p, c * sizeof(struct task));
if(pp)
{
p = pp;
capacity = c;
}
// else: apprpriate error handling
}
最后,完成时:
void push_back(struct task t)
{
if(count == capacity)
increase();
p[count++] = t;
}
删除元素留给您 - 您必须将后续元素全部复制到一个位置,然后减少计数。