取消引用三指针

时间:2013-04-07 08:51:00

标签: c visual-studio-2010 dereference

struct integer3_1 {
    int value3;
};

typedef struct integer3_1* intPtr;

struct integer3{
    intPtr* vPtr;
};

typedef struct integer3* intpointer3;   

int main() {
    int value = 5;
    intpointer3 intPtr3 = (intpointer3)malloc(sizeof(struct integer3));
    //(*intPtr3->vPtr)->value3 = value;
    //(*(*intPtr3).vPtr)->value3 = value;
    //(*intPtr3->vPtr)->value3 = &value;
    //(*(*intPtr3).vPtr)->value3 = &value;

return;

}

嗨,我有一个问题

如何取消引用intPtr3以便能够将值5存储到intPtr3->vPtr->value3

我尝试了几种方法,但我不断收到错误@@ a


第二部分

//1st line
intpointer3 intPtr3 = (intpointer3)malloc(sizeof(struct integer3));
//2nd line
(*intPtr3).vPtr = (intPtr*)malloc(sizeof(intPtr));
//3rd line
*((*intPtr3).vPtr) = (intPtr)malloc(sizeof(struct integer3_1));

1)在第1行,为intpointer3分配存储空间?

2)在第二行,您取消引用并为intPtr分配存储空间?

3)在第3行,你有什么解除引用?你分配了什么存储空间?

4)

之间有什么区别
(intpointer3)malloc(sizeof(struct integer3));

malloc(sizeof(struct integer3));

2 个答案:

答案 0 :(得分:3)

问题不在于解除引用。您尚未为integer3_1分配内存。

答案 1 :(得分:0)

如果结构integer3定义为

struct integer3{
    intPtr* vPtr;
};

然后解决方案如下所示

intpointer3 intPtr3 = (intpointer3)malloc(sizeof(struct integer3));

intPtr3的类型为intPointer3,与integer3 *相同。因此,首先我们需要为大小为integer3的对象分配空间。

(*intPtr3).vPtr = (intPtr *)malloc(sizeof(intPtr));

*intPtr3会提供integer3类型的对象。 integer3的指针vPtr的类型为intPtr*。因此,我们需要为大小为intPtr的对象分配空间,并将其分配给vPtr,因此,此语句。

*((*intPtr3).vPtr) = (intPtr)malloc(sizeof(struct integer3_1));

(*intPtr3).vPtr会提供intPtr *类型的对象,该对象与integer3_1 **相同。因此,此语句*((*intPtr3).vPtr)将取消引用与*(integer3_1 **)相同的integer3_1 *。因此,我们需要为大小为struct integer3_1的对象分配空间并将其分配给此指针。

(*((*intPtr3).vPtr))->value3 = value;

->运算符的LHS是integer3_1 *类型的指针,因此访问value3因此需要->运算符。

printf("Value is %d\n", (*((*intPtr3).vPtr))->value3);

上一个问题:

(intpointer3)malloc(sizeof(struct integer3));

malloc(sizeof(struct integer3));

是相同的,除了我们在第一种情况下明确地将分配的指针类型转换为intpointer3或更确切地说integer3 *。在像C++这样的MSVC++环境中进行开发时,这是必需的。使用gcc开发时不需要这样做。