使用数组

时间:2017-06-13 10:16:38

标签: c arrays memory struct

早上好! 我必须处理一个模拟列表的struct数组(全局变量)。在实践中,每次调用方法时,我都必须增加数组1的大小并将其插入到新结构中。

由于数组大小是静态的,我的想法是使用这样的指针:

  1. struct数组被声明为指向第二个struct数组的指针。
  2. 每次调用increaseSize()方法时,旧数组的内容都会复制到新的n + 1数组中。
  3. 全局数组指针已更新为指向新数组
  4. 理论上,解决方案似乎很容易......但我是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;
    }
    

1 个答案:

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

删除元素留给您 - 您必须将后续元素全部复制到一个位置,然后减少计数。