我正在阅读一个c ++源代码, 将中缀转换为后缀 我正在使用turbo c ++
#include <stdio.h>
typedef struct node
{
float data;
struct node *next;
} stack;
void StackInitiate(stack **head)
{
//error
if(*head=(stack *)malloc(sizeof(stack))==NULL)
exit(1);
(*head)->next=NULL;
}
//我得到..无法将'int'转换为'node *'...
任何人都可以告诉我为什么这样。以及如何解决这个问题。
完整源代码here
答案 0 :(得分:3)
由于operator precedence表达式
*head=(stack *)malloc(sizeof(stack))==NULL
实际上相当于
*head=((stack *)malloc(sizeof(stack))==NULL)
也就是说,您将比较的值分配给*head
。
您需要输入自己的括号才能使其正确无误:
(*head=(stack *)malloc(sizeof(stack)))==NULL
或者更好地使用new
运算符,这是您在C ++中动态分配对象时应该使用的运算符:
(*head=new stack)==NULL
答案 1 :(得分:2)
由于运算符优先级规则,以下内容:
if(*head=(stack *)malloc(sizeof(stack))==NULL)
被解析为
if(*head=((stack *)malloc(sizeof(stack))==NULL))
将== NULL
比较的结果分配给*head
。
要将*head
的新值与null进行比较,请使用括号更改优先级:
if((*head=(stack *)malloc(sizeof(stack)))==NULL)
甚至更好,将分配与if条件分开:
*head = (stack *) malloc(sizeof(stack));
if(*head == NULL)
此约定更具可读性,也可避免将来发生类似的错误。