我有以下指向结构的指针
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++
有更有效的方法吗?
答案 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)
我会逐点回答:
只有在知道自己在做什么时才进行指针操作。
假设sIndex
为int
,sIndex=0;
,则没有问题,但如果您增加sIndex
,则表示您没有分配该空间使用malloc
只需一个区块。
如果您需要访问多个此类块,则需要先适当地进行分配:
list_ptr = malloc(sizeof(struct ALIST)*N); //replace N with the number of blocks you want