【问题标题】:Why my code crashes if I call push function more than 8 times?如果我调用 push 函数超过 8 次,为什么我的代码会崩溃?
【发布时间】:2013-01-30 16:15:26
【问题描述】:

// 每当我将推送的函数调用时间增加超过 8 次时,它就会在一切正常之前崩溃。需要您的帮助。在下面的代码中,我使用动态数组创建了一个堆栈程序,记住不应该有任何堆栈溢出,只要堆栈被填满,就使用 realloc 函数将值加倍。

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
typedef struct ArrayStack
{
int top;
int capacity;
int *arr;
}*stack;

stack Creation()
{
 stack S;
 S=(stack)malloc(sizeof(struct ArrayStack));
 if(!S)return NULL;
 S->top=-1;
 S->capacity=1;
 S->arr=(int*)malloc(S->capacity*sizeof(int));
 if(!S->arr)return NULL;
 return S;
}
int is_Full(stack S)
{
return S->top==S->capacity-1;
}
int is_Empty(stack S)
{
return S->top==-1;
}

void Doubling(stack S)
{
 S->capacity*=2;
 S->arr=realloc(S->arr,S->capacity);
}

void push(stack S,int data)
{
if(is_Full(S)) 
Doubling(S);

S->arr[++S->top]=data;
}

int pop(stack S)
{
if(is_Empty(S))
printf("\nStack underflow");
else
return S->arr[S->top--];
}

int main()
{
stack S;
int i=0,size=9;
S=Creation();
**for(i=0;i<size;i++)
push(S,19+1);**   // As in this case

return 0;
}

【问题讨论】:

    标签: c stack stack-overflow


    【解决方案1】:
    S->arr = malloc(S->capacity * sizeof(int));
    S->arr = realloc(S->arr, S->capacity);
    

    您只为S-&gt;capacity / sizeof(int) 项重新分配足够的空间。

    【讨论】:

    • @Atiq - 当你调用malloc 时,你分配了容量* sizeof(int) 字节,这对于容量元素来说已经足够了。当您调用realloc 时,您只分配容量bytes,仅够容量/sizeof(int) 元素使用。你的代码试图表现得好像它有足够的空间容纳容量元素,所以它会溢出缓冲区并崩溃。
    • @Atiq - 很高兴我能帮上忙。如果我(或任何其他 SO 用户)能够回答您的问题,那么您能否将答案标记为已接受?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多