0
  • 函数名称:expandStack
  • 输入:指向堆栈类型的指针 (Stack*)
  • 输出:无
  • 函数操作:函数展开堆栈
void expandStack(Stack* stack){

    //Check the stack and the array are allocated
    if (stack == NULL ||stack->content == NULL)
    {
        return;
    }

    //Allocating a new sized array (*2 from the previous)
    Element* expandedStack = (Element*)malloc(2 * (stack->size) * sizeof(Element));

    //Case malloc failed
    if (expandedStack == NULL)
    {
        printf("Error! Malloc has failed in file 'stack.c', 'expandStack' function\n");
        return;
    }

    //Updating size field
    stack->size *= 2;

    //Copy values from the previous array to the new array allocated
    for (int i = 0; i <= stack->topIndex; i++)
    {
        expandedStack[i].c = stack->content[i].c;
    }

    //Free old array
    free(stack->content);

    //Point to the new array in the heap
    stack->content = expandedStack;

}

在这一行:expandStack[i].c = stack->content[i].c; 我收到一个“绿色警告”,说:“c6386 缓冲区在写入 'expandedStack' 时溢出:可写大小为 '2 * (stack->size) * sizeof(Element)' 字节,但可能会写入 '2' 字节。

问题是代码工作正常,它可以编译。

4

2 回答 2

0

我检查了错误的详细信息,“大小”理论上可以为 0,但默认值为 1,它永远不会为 0。

我刚刚添加了一个检查 size 不是 0 并且它消失了。

谢谢!

于 2020-01-06T19:43:32.573 回答
0

这是一个警告,表示缓冲区可能溢出,并试图警告您在生产代码中添加更多检查。这不一定是错误。如果您确实超出了缓冲区,那么在运行时您会遇到异常,这会说Stack corruption around local variable ...

调试程序,看看是否出现类似的异常。如果没有,那么您没有超出缓冲区的范围。

于 2020-01-06T19:31:26.940 回答