【发布时间】:2025-11-22 02:55:01
【问题描述】:
我需要为我的结构内的一个数组分配内存,这个数组在我定义结构时没有定义的大小:
typedef struct stacks {
int size; // Stores the size of my -values- array
int sp; //points to the top of the stack, my stackpointer
int *values;
} STACKS;
所以,为了初始化我的结构,我编写了这个函数,它为我的数组分配(使用 calloc?)内存,然后我将数组的新大小放入 SIZE 变量中。
#define MAXIMUM 10
int initStacks(STACKS *s){
s->values = calloc(MAXIMUM,sizeof(int));
s->size = MAXIMUM;
s->sp = 0;
return 0;
}
现在,如果我想将某些东西推到堆栈顶部(LIFO),我会使用这个:
int pushs(STACKS *s, int x){
if (s->sp==s->size) {
realloc(s->values, MAXIMUM * sizeof(int));
s->size*=2;
}
s->values[s->sp]=x;
s->sp++;
}
这是正确的做法吗?
realloc 在我的函数中是否正常工作?
非常感谢您的帮助!
编辑:
这会更有意义吗?这样,我真的不需要声明数组的值,即用#define maximum 10 定义的值
typedef struct stacks {
int size; // guarda o tamanho do array valores
int sp;
int *values;
} STACKS;
int initStacks(STACKS *s){
s->values = calloc(1,sizeof(int));
s->size = 1;
s->sp = 0;
return 0;
}
int isEmptys(STACKS *s){
return((s->sp)==0);
}
int pushs(STACKS *s, int x){
s->size++;
realloc(s->values, s->size * sizeof(int));
s->values[s->sp]=x;
s->sp++;
}
【问题讨论】:
-
您至少应该检查 realloc 的返回值,如果为 NULL 则请求失败,您必须重新(al)定位堆栈。 s->size==MAXIMUM 的比较也有点可疑,也许应该是 s->sp==MAXIMUM
-
伙计,这种比较当然是愚蠢的!谢谢你指出!也许更好的是
s->sp==s->size?这意味着堆栈指针到达了等于最大值的点? -
你两次展示了
initStacks函数。 -
@KeithThompson 你是对的,对不起。试图仔细编写问题并最终添加了两次相同的功能。
-
正如@FoggyDay 所写,我不会为每个元素重新分配,但例如每次加倍大小。因此,您丢失的内存不超过 50%。或者,您可以使用完全不同的结构:每个节点都包含一些元素的链表。这完全避免了 realloc,包括它的陷阱(碎片,内存不足)。以防万一您计划做更大的事情;-)
标签: c