两次函数调用之间的数组损坏

时间:2018-06-25 17:31:49

标签: c data-structures

我正在尝试使用数组实现堆栈数据结构。当我第一次调用push()函数时,它可以正常工作。但是,当我第二次调用它时,在以下语句中出现了段错误:-*stack[*tos] = data;

这可能是因为阵列已损坏。我执行pop()函数时发现了这个原因。它正在改变除弹出元素之外的所有元素。我为弹出的元素分配了“ 0”。

这是完整的代码:

#include <stdio.h>
#include <stdlib.h>

void push(int data, int *tos, int size, int **stack)
{
    (*tos)++;
    printf("\ntos = %d\n", *tos);
    if (*tos > size)
    {
        puts("\nStack Overflow!!!\n");
        (*tos)--;
        return;
    }
    printf("\ndata = %d\n", data);
    *stack[*tos] = data;
    printf("\nstack[*tos] = %d\n", *stack[*tos]);
}

void pop(int *tos, int **stack)
{
    if ((*tos) == -1)
    {
        puts("\nStack Underflow!!!\n");
        return;
    }
    stack[*tos] = 0;
    (*tos)--;

    for (int i = 0; i < 5; i++)
        printf("%d\t", stack[i]);
    puts("\n");

}

int main()
{
    int size = 0, tos = -1;
    printf("\nEnter size of stack: ");
    scanf("%d", &size);
    int *stack = (int *) calloc(size, sizeof(int));

    push(9, &tos, size, &stack); push(1, &tos, size, &stack); //push(2, &tos, size, stack); push(3, &tos, size, stack); push(4, &tos, size, stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

    pop(&tos, &stack); //pop(&tos, &stack);

    /*for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");*/

    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是operator precedence。下标运算符[]的优先级高于间接运算符*的优先级。所以

*stack[*tos] = data;

解析为:

*(stack[*tos]) = data;

但是stack是指向数组的指针,而不是指向指针数组的指针,因此您需要先进行间接访问,然后再进行下标。所以应该是:

(*stack)[*tos] = data;

并且pop()缺少stack的所有取消引用。

这是完全可用的版本:

#include <stdio.h>
#include <stdlib.h>

void push(int data, int *tos, int size, int **stack)
{
    (*tos)++;
    printf("\ntos = %d\n", *tos);
    if (*tos > size)
    {
        puts("\nStack Overflow!!!\n");
        (*tos)--;
        return;
    }
    printf("\ndata = %d\n", data);
    (*stack)[*tos] = data;
    printf("\nstack[*tos] = %d\n", (*stack)[*tos]);
}

void pop(int *tos, int **stack)
{
    if ((*tos) == -1)
    {
        puts("\nStack Underflow!!!\n");
        return;
    }
    (*stack)[*tos] = 0;
    (*tos)--;

    for (int i = 0; i <= (*tos); i++)
        printf("%d\t", (*stack)[i]);
    puts("\n");

}

int main()
{
    int size = 0, tos = -1;
    printf("\nEnter size of stack: ");
    scanf("%d", &size);
    int *stack = (int *) calloc(size, sizeof(int));

    push(9, &tos, size, &stack);
    push(1, &tos, size, &stack);
    push(2, &tos, size, &stack);
    push(3, &tos, size, &stack);
    push(4, &tos, size, &stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

    pop(&tos, &stack); //pop(&tos, &stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

    return 0;
}