嵌套在结构中的联合中的值不更新

我正在用C编写一个堆栈实现,它允许存储任何数据类型。到目前为止,我有:

//stack.h
枚举元素类型{
元素_CHAR,
元素_INT,
双元素,
元素浮点数
};
类型定义结构{
枚举元素类型;
联合{
char val_c;
国际瓦卢一世;
双重价值;
浮动增值税;
};
}堆叠单元;
类型定义结构{
未签名的顶部;
无符号容量;
堆栈元素*元素;
}堆叠;
Stack*Stack\u malloc(无符号容量){
Stack*Stack=(Stack*)malloc(sizeof(Stack));
堆栈->顶部=0;
堆栈->容量=容量;
堆栈->元素=(堆栈元素*)malloc(sizeof(堆栈->元素)*容量);
返回栈;
}
无效堆栈推送(堆栈*堆栈,枚举元素类型,…){
如果(已满(堆栈)){
回来
}
va_列表ap;
va_启动(ap,类型);
开关(类型){
case元素\u CHAR:
printf(“推送字符:%c\n”,(字符)va_arg(ap,int));
堆栈->元素[stack->top].val_c=(char)va_arg(ap,int);//问题
printf(“推送后:%c\n”,堆栈->元素[stack->top].val_c);
打破
案例元素_INT:
printf(“推送int:%d\n”,va_arg(ap,int));
堆栈->元素[stack->top].val_i=va_arg(ap,int);//问题
printf(“推送后:%d\n”,堆栈->元素[stack->top].val_i);
打破
case-ELEMENT_-DOUBLE:
printf(“推送双精度:%f\n”,虚拟参数(ap,双精度));
//u-stack(val-d)>双栈元素
printf(“推送后:%f\n”,堆栈->元素[stack->top].val\d);
打破
case元素\u FLOAT:
printf(“推送浮点值:%f\n”,(浮点值)va_arg(ap,double));
堆栈->元素[stack->top].val_f=(float)va_arg(ap,double);//问题
printf(“推送后:%f\n”,堆栈->元素[stack->top].val\f);
打破
}
堆栈->元素[堆栈->顶部].type=type;
堆栈->top++;
va_端(ap);
}

我遇到的问题是行stack->元素[堆栈->顶部].val?。在第一个printf中,我打印按下X:%X,该值是正确的,因此我将使用类似于按下int:123的内容

但是第二个printf的输出在按下:291176586或另一个垃圾值后为。我不明白为什么会这样。感谢您的帮助

您使用的va_arg不正确。手册页上说:

每次调用va_arg()都会修改ap so
依次返回连续参数的值。

但是你可以访问它两次。将代码更改为:

chartmp=(char)va_arg(ap,int);//保存在tmp变量中
printf(“推送字符:%c\n”,tmp);
堆栈->元素[堆栈->顶部].val_c=tmp;
printf(“推送后:%c\n”,堆栈->元素[stack->top].val_c);
打破

此外,正如评论中指出的那样,您的malloc是错误的

堆栈->元素=(堆栈元素*)malloc(sizeof(堆栈元素)*容量);

应该是

堆栈->元素=malloc(sizeof(*堆栈->元素)*容量);
^
注意

也就是说我更喜欢这道菜

堆栈->元素=malloc(容量*大小*堆栈->元素);

但它也在做同样的事情

发表评论