c - 在地址上调用堆栈推送时如何避免更改值
问题描述
所以我有这段代码,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);
}
解决方案
鉴于这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);
}
推荐阅读
- elasticsearch - 将数据同步到 Elasticsearch 随机失败
- python - 熊猫合并数据框的条件取决于列中的值
- jquery - 未捕获的类型错误:“#edit_employment_type”.val 不是函数
- linux - Weka 从 Linux 终端“选择属性”
- ios - 在简单的可解码游乐场中识别问题
- c# - EntityFramework 多个 Group by 查询
- django - 保存后更新 M2M 模型
- oracle - Oracle:更新的动态 SQL 不起作用
- flutter - 如何使用 Jenkins 将 URL 等环境配置传递给 Flutter 应用程序?
- python - sklearn.datasets.make_blobs() 生成的各向同性高斯 Blob 的分布?