【问题标题】:how to avoid changing value when stack push is called on a adress在地址上调用堆栈推送时如何避免更改值
【发布时间】:2020-11-22 12:59:44
【问题描述】:

所以我有这段代码,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);
}

【问题讨论】:

  • 使用单独的变量。提供给您的堆栈 API 存储指向原始变量的引用/指针。所以你需要每次推送不同的变量。
  • 由于您没有显示正确的minimal reproducible example,因此除了猜测之外很难做任何事情,但猜测是堆栈包含指向int指针(而不是int )。由于您要添加指针,所有指针都将完全相同:指向cnt 的指针。由于所有指针都相同,因此该值似乎是分配给cnt 的最后一个值。

标签: c pointers stack


【解决方案1】:

鉴于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);
}

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 2015-06-11
    • 2010-11-02
    • 2014-10-30
    • 2012-03-04
    • 1970-01-01
    • 2015-04-22
    • 2014-04-17
    • 2011-04-01
    相关资源
    最近更新 更多