C语言 数组在函数调用之间损坏



我正在尝试使用数组实现堆栈数据结构。当我第一次调用 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 = %dn", *tos);
if (*tos > size)
{
puts("nStack Overflow!!!n");
(*tos)--;
return;
}
printf("ndata = %dn", data);
*stack[*tos] = data;
printf("nstack[*tos] = %dn", *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("%dt", 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("%dt", stack[i]);
puts("n");
pop(&tos, &stack); //pop(&tos, &stack);
/*for (int i = 0; i < size; i++)
printf("%dt", stack[i]);
puts("n");*/
return 0;
}

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

*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 = %dn", *tos);
if (*tos > size)
{
puts("nStack Overflow!!!n");
(*tos)--;
return;
}
printf("ndata = %dn", data);
(*stack)[*tos] = data;
printf("nstack[*tos] = %dn", (*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("%dt", (*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("%dt", stack[i]);
puts("n");
pop(&tos, &stack); //pop(&tos, &stack);
for (int i = 0; i < size; i++)
printf("%dt", stack[i]);
puts("n");
return 0;
}

最新更新