因此,这是一个非常简单的堆栈实现(仅包含准系统推送弹出功能的数组)。我试图理解为什么将值推入数组后索引没有改变。我最初将itop变量放置在main中为“ int itop = 0”,但是由于itop值保持为0,我认为这可能是传递引用的问题,其中C取值的副本而没有t实际上会更改传入的值本身。因此,我想可以将它设为顶部的静态int(我知道这是不安全的,因为不安全的线程行为...),但是它仍然无法正常工作。
有人指出我要了解这个基本概念吗?谢谢
#include <stdio.h>
void push(int a[], int, int);
int pop(int a[], int);
static int itop = 0;
int main(void){
int stack[100];
push(stack, itop, 1);
push(stack, itop, 2);
printf("index is %d\n", itop);
int p1 = pop(stack, itop);
printf("index is %d\n", itop);
int p2 = pop(stack, itop);
int p3 = pop(stack, itop);
printf("popped elements: %d %d %d\n", p1, p2, p3);
return 0;
}
void push(int a[], int ind, int elem){
a[ind++] = elem;
}
int pop(int a[], int ind){
if (ind < 0){
return -1;
}
else {
return a[ind--];
}
}
您没有通过itop
引用传递变量。您正在通过价值传递它。这两个函数都处理变量itop的副本,因此更改副本不会影响原始对象。
在C中通过引用传递意味着间接通过指针传递对象。
而且pop函数在这些语句中也有bug
if (ind < 0){
^^^^^^^
和
return a[ind--];
^^^^^
可以通过以下方式声明和定义函数
void push(int a[], int *ind, int elem){
a[( *ind )++] = elem;
}
int pop(int a[], int *ind){
if (*ind == 0){
return -1;
}
else {
return a[--*ind];
}
}
请注意,一般而言,函数pop具有一个缺点,即不允许将-1存储在堆栈中,因为从函数返回的值-1是不明确的,并且可能意味着错误或堆栈的实际元素。
该功能可以通过以下方式定义
int pop( int a[], int *ind, int *value )
{
int error = *ind == 0 ? -1 : 0;
if ( error == 0 )
{
*value = a[--*ind];
}
return error;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句