首页 > 解决方案 > 在地址上调用堆栈推送时如何避免更改值

问题描述

所以我有这段代码,stack_push 实现接受了一个地址,所以每当我改变 cnt 值时,其他一切都会改变,我该如何防止呢?我希望它为 x= 5 然后 x= 2 我无法更改我的 stack_push 函数,因为它是一个不透明的结构

int main(void){
  struct stack *a = stack_create(10*4);
  int cnt = 10;
  int i=cnt;
  while (cnt != 1){
    cnt = i/2;
    stack_push(a,&cnt);
    i = cnt;

  }
  int *x = stack_pop(a);
  x = stack_pop(a);
  stack_destroy(a);
}

标签: cpointersstack

解决方案


鉴于这stack_create是在操纵,它意味着以下内容:

  • 将数据放入堆栈时,必须将数据复制到malloc块中
  • 从堆栈中拉取数据时,必须在不再使用时释放数据

最有可能的是, stack_* 具有检查堆栈何时为空的功能。考虑以下代码以将多个值推送到堆栈,并按照上述几点检索它们。

考虑以下

int main(void){
  struct stack *a = stack_create(10*4);
  int cnt = 10;
  int i=cnt;
  while (cnt != 1){
    cnt = i/2;
    //// COPY data to newly allocated block
    int *data = calloc(sizeof(*data)) ;
    *data = cnt ;
    stack_push(a,data);
    i = cnt;
  }

  //// Retrieve all items
  while ( !stackIsEmpty(a) ) {
     int *x = stack_pop(a);
     printf ("%d\n", *x) ;
     //// Free the copied data
     free(x) ;
  } ;
  stack_destroy(a);
}


推荐阅读