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));
答案 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
开发时不需要这样做。