Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
realloc已触发断点_C - Fatal编程技术网

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

我的程序中有一个问题,我用C实现了一个简单的堆栈 问题是,当我第二次尝试重新分配堆栈数组时,程序会在realloc函数内部触发一个brekapoint,我不知道会出什么问题,因为我正在使用缓冲区检查realloc是否失败。可能,这段代码就是我使用realloc函数的地方:

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)条件被计算为true
if(instance->top>=instance->initial\u size)
之前,初始大小包含字节数,顶部包含元素数。再次感谢@kiran Biradar,我现在将越来越多地研究解决方案,以获得清晰的想法!