C 赋值的左操作数需要左值

C 赋值的左操作数需要左值,c,macros,C,Macros,起作用的示例: #define DIR(n,d) (d==LEFT?n.left:n.right) struct node { struct node*left; struct node*right; int value; }; struct node n; n.left=malloc( sizeof(struct node) ); n.right=malloc( sizeof(struct node) ); DIR(n,d)->value=26; (d==1?

起作用的示例:

#define DIR(n,d) (d==LEFT?n.left:n.right)

struct node {
struct node*left;   
struct node*right;
int value;  
};

struct node n;
n.left=malloc( sizeof(struct node) );   
n.right=malloc( sizeof(struct node) );  

DIR(n,d)->value=26;

(d==1?n.left:n.right)->value=26;
#define DIR(mem,d) d==LEFT?mem->left:mem->right
不起作用的示例:

#define DIR(n,d) (d==LEFT?n.left:n.right)

struct node {
struct node*left;   
struct node*right;
int value;  
};

struct node n;
n.left=malloc( sizeof(struct node) );   
n.right=malloc( sizeof(struct node) );  

DIR(n,d)->value=26;

(d==1?n.left:n.right)->value=26;
#define DIR(mem,d) d==LEFT?mem->left:mem->right

另一个结构:

 struct Node{
    char color;
    int height;
    Node* parent;
    Node* left;
    Node* right;
    Container*data;
 };
在主功能中,我执行以下操作:

Node*temp;
Node*mem=malloc( sizeof(Node) );
d=LEFT;
temp=malloc( sizeof(Node) );
DIR(mem,d) = temp;
错误:赋值的左操作数需要左值 DIR(mem,d)=温度


谢谢。

三元运算符在C中不会产生左值。一种替代方法是:

#define DIR(n,d) *((d)==LEFT?&(n).left:&(n).right)

请注意,您应该将宏参数的所有用法都括起来。

错误消息表示清除。LHS的值不是左值。当你太喜欢宏时就会发生这种情况。解决方案:不要使用这样的宏。它们不值得您在调试时遇到的麻烦,并且不需要多余的键入。
mem->left
有什么问题?(仅供参考:
p->m
(*p).m
相同。不要使用后者(更多的输入,更不清晰)。那么答案是什么?我应该怎么做?如何在第二种情况下访问struct元素?要改进您的问题,请删除所有“有效”的内容。你只需要发布不起作用的内容。大约有4行相关信息和一堆垃圾。也不要包含
-E
输出。我实际上尝试过这个,但也不起作用,现在我正在尝试访问非结构或文件中的内容union@M.M,您需要取消对传递的指针的引用:
#define DIR(n,d)*((d)==2&((*n.左):&(*n.右))
@Anatoly使用
*mem
作为参数或遵循Alter Mann的建议。以后最好发布一个,因为这样人们更容易发布准确的信息answers@AlterMann好的,在最初的问题中,不清楚这个参数是否是指针,我没有改变任何有问题的东西,除了你告诉我的情感