gpt4 book ai didi

c - 写入动态内存

转载 作者:行者123 更新时间:2023-11-30 15:36:42 25 4
gpt4 key购买 nike

我有以下指向结构的指针

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++

有没有更有效的方法?

最佳答案

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

类似于:

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);

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

关于c - 写入动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com