写入动态内存

时间:2014-03-18 07:29:46

标签: c memory dynamic malloc

我有以下指向结构的指针

struct ALIST                     
{
    short sPeriod;
    long lDate;
}*list_ptr;

list_ptr = malloc(sizeof(*list_ptr));

现在,如果我有一个全局变量sIndex,我将其初始化为零,是否可以这样做?

(list_ptr + sIndex)->sPeriod = period_variable;
(list_ptr + sIndex)->lDate = date_variable;
sIndex++

有更有效的方法吗?

2 个答案:

答案 0 :(得分:1)

这看起来像是要分配动态数组。创建一个大小变量并将其设置为数组的起始大小。

类似的东西:

size_t list_size = 10;
struct ALIST list_ptr = 0;
size_t i;    

list_ptr = malloc(sizeof(*list_ptr) * list_size);
for(i=0; i<list_size; ++i) {
    list_ptr[i].sPeriod = period;
    list_ptr[i].lDate = date;
}

现在,如果你不知道数组的大小,那么你想要的东西最终会像C ++ std :: vector那样很多

我构建了一个在结构中包含必要信息的C版本。使用realloc调整大小。

它可能看起来像(注意,这完全没有尝试):

struct dynamic_ALIST {
    struct ALIST *array;
    size_t size;
    size_t capacity;
};

void dynamic_ALIST_construct(struct dynamic_ALIST *x, size_t initial_size)
{
    x->array = 0;
    x->size = 0;
    x->capacity = 0;
    dynamic_ALIST_reserve(x, initial_size);
}

void dynamic_ALIST_reserve(struct dynamic_ALIST *x, size_t size)
{
    struct ALIST *tmp = realloc(x->array, sizeof(*tmp) * size);
    if(!tmp) abort();
    x->array = tmp;
    x->capacity = size;
}

struct ALIST* dynamic_ALIST_get(struct dynamic_ALIST *x, size_t offset)
{
    if(offset < x->size) {
        return x->array + offset;
    }
    if(offset < x->capacity) {
        x->size = offset + 1;
        return x->array + offset;
    }
    dynamic_ALIST_reserve(x, offset+1);
    return dynamic_ALIST_get(x, offset);
}

然后你就可以使用它:

void f()
{
    size_t item_index = 0;
    struct dynamic_ALIST list;
    FILE *fp = fopen("filename");

    dynamic_ALIST_construct(list, 0);
    while( read_item(fp, dynamic_ALIST_get(list,item_index)) ) {
        item_index++;
    }
    fclose(fp);
}

您可以对此进行各种更改。 get函数可能会返回错误,而不是自动创建新条目。您可能会创建另一个增加大小的函数。您可能希望有一个函数在返回新内存之前将所有值设置为零。

如果要包含许多不同的结构,可以将所有上述dynamic_ALIST结构,并构造,保留,获取函数放入宏中。如果您这样做,那么您只需说:

NEW_DYNAMIC_STRUCT(ALIST);

预处理器吐出一个全新的副本,所有名称都已更改。

答案 1 :(得分:0)

我会逐点回答:

  1. 只有在知道自己在做什么时才进行指针操作。

  2. 假设sIndexintsIndex=0;,则没有问题,但如果您增加sIndex,则表示您没有分配该空间使用malloc只需一个区块。

  3. 如果您需要访问多个此类块,则需要先适当地进行分配:

    list_ptr = malloc(sizeof(struct ALIST)*N); //replace N with the number of blocks you want