Возникли проблемы с использованием структур и указателей в C - PullRequest
0 голосов
/ 28 мая 2011

Я программирую на C. Учитывая следующий код.

Моя структура определяется как:

// Define the stack
struct stackNode {
char data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

Используются следующие переменные:

StackNode topTracker; // The pointer of this stackNode will always point to the top of the stack

И я пытаюсь выполнить следующую функцию.

char pop( StackNodePtr *topPtr ){
    char returnable;
// store the Node.data from the top of the stack
    returnable = *topPtr.data; //[1]
// Set the next Node to the top of the stack
    topTracker.nextPtr = *topPtr.nextPtr; //[2]
// return the Node data.
    return returnable;

Проблема в том, что я получаю следующую ошибку: в точке [1] и [2] соответственно

"запрос на член data' in something not a structure or union" "request for member nextPtr 'в чем-то, не являющемся структурой или объединением"

Как мне обойти эту ошибку и получить доступ к данным и nextPtr указателя * topPtr? Учитывая, что * topPtr будет указателем на фактический StackNode во время выполнения.

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

topPtr имеет тип StackNodePtr*, который является псевдонимом для StackNode**. Это означает, что *topPtr имеет тип StackNode*, который является типом указателя, и вы должны получить доступ к членам, используя ->.

Также следует помнить, что операторы . и -> связываются сильнее, чем унарные *. Поэтому вам нужно использовать круглые скобки для манипулирования порядком оценки:

returnable = (*topPtr)->data;

или

returnable = (**topPtr).data;
1 голос
/ 28 мая 2011

*topPtr дает StackNodePtr. который все еще на одном уровне от структуры. вам нужно разыменовать его еще раз, чтобы получить StackNode.
(**topPtr) даст StackNode.

используйте (**topPtr).data или (*Ptr)->data для перехода к элементу структуры.

0 голосов
/ 28 мая 2011

при неправильном синтаксисе это должно быть topPtr-> data. Также, если вам нужно учиться, узнайте сейчас об утечках памяти. Это там, в вашей программе выше. так что как только вы получите ваши данные освободить память Например. returnable = topPtr-> data; StackNodePtr * tmp = topPtr; topTracker-> nextPtr = topPtr-> nextPtr; бесплатно (TMP); возврат возвратный;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...