realloc已触发断点
我的程序中有一个问题,我用C实现了一个简单的堆栈 问题是,当我第二次尝试重新分配堆栈数组时,程序会在realloc函数内部触发一个brekapoint,我不知道会出什么问题,因为我正在使用缓冲区检查realloc是否失败。可能,这段代码就是我使用realloc函数的地方:realloc已触发断点,c,C,我的程序中有一个问题,我用C实现了一个简单的堆栈 问题是,当我第二次尝试重新分配堆栈数组时,程序会在realloc函数内部触发一个brekapoint,我不知道会出什么问题,因为我正在使用缓冲区检查realloc是否失败。可能,这段代码就是我使用realloc函数的地方: struct stack { void** data; int top; int initial_size; }; static void stack_resize(struct stack* ins
struct stack {
void** data;
int top;
int initial_size;
};
static void stack_resize(struct stack* instance, int capacity)
{
if (instance->initial_size == instance->top)
{
int new_sz = capacity * sizeof *instance->data;
// THIS REALLOC crashes
void** buffer = realloc(instance->data, new_sz); // realloc the stack array
printf("reallocating memory\n");
if (buffer) {
instance->data = buffer;
instance->initial_size = new_sz;
}
}
}
下面的函数是调用stack\u resize()的地方
void stack_push(struct stack* instance, void* data)
{
if (instance->top >= instance->initial_size)
{
// shrink the array
stack_resize(instance, instance->initial_size);
}
instance->data[++instance->top] = data;
printf("pushing onto the stack!\n");
}
这是我初始化所有数据的构造函数。
struct stack* stack_new(int initial_size)
{
struct stack* new_stack = (struct stack*)malloc(sizeof(struct stack));
if (!new_stack) {
fprintf(stderr, "no memory available from the operative system\n");
return NULL;
}
memset(new_stack, 0, sizeof(struct stack));
new_stack->data = (void**)malloc(sizeof(void*) * initial_size);
if (!new_stack->data) {
fprintf(stderr, "could not allocate memory for the buffer\n");
return NULL;
}
printf("created a stack with %d slot(s)\n", initial_size);
new_stack->top = -1;
new_stack->initial_size = initial_size;
return new_stack;
}
这是该计划的切入点:
int main(int argc, char** argv)
{
struct stack* new_stack = stack_new(2);
for (int i = 0; i < 55; i++)
{
stack_push(new_stack, (void*)i);
}
getchar();
return 0;
}
int main(int argc,char**argv)
{
结构堆栈*新堆栈=堆栈新(2);
对于(int i=0;i<55;i++)
{
堆栈推送(新堆栈,(无效*)i);
}
getchar();
返回0;
}
任何帮助都将不胜感激!感谢大家。崩溃是因为您正在将
new_sz
分配给instance->initial_size
。
因为new_sz
以字节为单位保存数组的实际大小,即capacity*sizeof(void*)
int new_sz = capacity * sizeof *instance->data;
instance->initial_size = new_sz;
堆栈顶部
和初始大小
将不匹配
if (instance->top >= instance->initial_size)
您的top
将始终小于initial\u size
,并且您不会分配新内存
为了使您的程序正常工作,您需要进行以下更改
int new_sz = (capacity+1) * sizeof(void *);
instance->initial_size = capacity+1;//instead of new_size
启动时
实例->数据是否为空?它是如何初始化的?堆栈的大小是什么(实例,实例->初始大小)代码>精确实现?我们需要一个使用代码的main
程序。大家好,我刚刚编辑了这篇文章,这样你们就可以了解更多关于数据初始化的信息。此外,你们似乎混淆了元素数组大小和字节数组大小。两个初始尺寸中的哪一个是?这两个new_sz
是哪一个?哦!非常感谢,它工作了,程序不再崩溃,但我现在有一个问题:在第一个程序启动时,当我执行stack_new(10)代码>它创建一个包含10个插槽的新堆栈,然后推送10个项目,当到达顶部时,调用堆栈调整大小()
并将容量增加1,因此我通过执行以下操作对其进行了修复:堆栈调整大小(容量*2)
因此每次它都会将容量增加一倍2,4。。等等,问题是在重新分配内存的前两次,堆栈上的推送项是相同的数字,即使容量加倍。@Lukas realloc不会改变内存中的数据。它创建一个新的分配,将数据移动到那里,然后释放旧的分配。所以你的数据不会改变。但是我不明白为什么堆栈top
和堆栈initial\u size
不匹配是因为它们是两个整数,而且如果(instance->top>=instance->initial\u size)条件被计算为trueif(instance->top>=instance->initial\u size)
之前,初始大小包含字节数,顶部包含元素数。再次感谢@kiran Biradar,我现在将越来越多地研究解决方案,以获得清晰的想法!