2013-04-07 2 views
1
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

Я попытался несколько способов, но я продолжал получаю ошибку @@ в


2-й части

//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) На третьей строке, что вы имеете разыменование? какое хранилище вы выделили?

4) В чем разница между

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

и

malloc(sizeof(struct integer3)); 

?

ответ

3

Проблема не является разыменованием. Вы еще не выделили память для integer3_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++, например . Это не обязательно при разработке с gcc.

+0

Я пробовал код, но он не работает? –

+0

@RexRau .. Вы сталкиваетесь с проблемами 'компиляции' или' runtime'? Я пробовал это на 'gcc', и он работает на моем конце. – Ganesh

+0

ggc complier? Я использую visual stdio 2012, я думаю, что код не работает на визуальном stdio? –

Смежные вопросы