2012-12-05 151 views
0

这是如何将值赋给自引用结构类型的对象的成员?

typedef struct treeNode 
    { 
     int data,pos; 
     char name[16]; 
     struct treeNode *left; 
     struct treeNode *right; 
    }treeNode; 

我已经创建了一个动态对象

treeNode *temp; 
      temp = (treeNode *)malloc(sizeof(treeNode)); 

如果非要赋值的数据应该怎么分配

scanf("%d",temp->data); //or 
scanf("%d",&(temp->data)); //why? because all scanf will look for is address to a location which could be done by temp->data; 

和我的结构的Def这也适用于访问数据也即我应该如何访问整数部分?

temp->data; //or 
*(temp->data) 
+0

[不要强制'malloc'](http://stackoverflow.com/a/605858/1848654)。 – melpomene

回答

2

scanf("%d",&temp->data);

因为scanf()的需要可变的地址。对于每个转换说明符,scanf()都希望相应的参数是一个指向正确类型的指针:%d期望类型为int *的参数,%f期望类型为double *,%c和%s的参数都期望参数char *类型等。

Behaviour of scanf()给出了关于scanf()的更多信息。

对于访问temp->data就足够了,因为它基本上等于(*temp).data

如果您尝试访问*(temp->data),则会触发未定义的行为。因为,您正在访问可能位于其他进程上下文中的内存位置。

说TEMP->数据是100,则*(TEMP->数据)指*(100),即,在存储器位置访问100

+0

temp->数据本身指的是一个地址。不是吗? –

+0

@amitgupta:号码 – melpomene

+1

不,它取消引用它。 – Jeyaram

0

每当你想设置传递的参数的值进入一个功能,你需要发送地址。由于您希望scanf填充该参数的值,因此您需要使用该地址。 (请注意,如果struct元素已经是一个指针(分配给它的内存),则不需要&)。

但是,当您想要阅读某些内容时,不需要使用该地址。你可以直接使用它。

+0

在分配类似temp-> data的情况下,行为是不确定的。在我的情况下,我得到了一个“访问冲突”的运行时错误,这是我以前不想发生的事情。所以我想清除一些事情。 –

+0

它试图将temp-> data中的任何值作为指针。这几乎总是指向与进程无关的内存,所以你将会遇到访问冲突。 – xaxxon

相关问题