我正在尝试使用数组实现堆栈数据结构。当我第一次调用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;
}
答案 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;
}