gpt4 book ai didi

c - 数组在函数调用之间被损坏

转载 作者:行者123 更新时间:2023-11-30 19:30:25 24 4
gpt4 key购买 nike

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

最佳答案

问题是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;
}

关于c - 数组在函数调用之间被损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51028966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com