Могу ли я получить доступ к члену структуры с указателем на структуру, которая содержит указатель на эту структуру - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь получить доступ к членам в структуре tCAN_MESSAGE. То, что я думаю, будет работать, как первый пример в main, то есть some_ptr->canMessage_ptr->value = 10;. Но у меня есть код, который написал кто-то другой, и я вижу, что этот человек использовал some_ptr->canMessage_ptr[i].value;. Можно ли сделать это первым способом? Мы часто используем указатели на структуры, содержащие указатель на другую структуру (как в примере ниже), но я никогда не видел использование ptr1-> ptr2-> value?

typedef struct
{
     int value1;
     int value2;
     int value3;
     float value4;
}tCAN_MESSAGE;

typedef struct
{
     tCAN_MESSAGE *canMessage_ptr;
}tSOMETHING;

int main(void)
{
    tCAN_MESSATE var_canMessage;
    tSOMETHING var_something;

    tSOMETHING *some_ptr = &var_something;
    some_ptr->canMessage_ptr = &var_canMessage;


    some_ptr->canMessage_ptr->value1 = 10; //is this valid?

     //I have some code that are doing this, ant iterating trough it with a for:
    some_ptr->canMessage_ptr[i].value1; //Is this valid?

    return 0
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Это очень просто: каждый указатель должен быть установлен так, чтобы он указывал на правильную ячейку памяти перед использованием. Если это не так, вы не можете использовать его. Вы не можете «хранить данные внутри указателей». Смотрите это:

Cra sh или "ошибка сегментации", когда данные копируются / сканируются / читаются по неинициализированному указателю

Ни один из ваших кодов не действителен. some_ptr нигде не указывает, поэтому к нему нельзя получить доступ, равно как и к его членам. Точно так же, some_ptr->canMessage_ptr также нигде не установлен.

1 голос
/ 16 марта 2020

Я пытаюсь получить доступ к членам в структуре tCAN_MESSAGE. То, что я думаю, будет работать, как первый пример в main, то есть some_ptr->canMessage_ptr->value = 10;. Но у меня есть код, который кто-то написал, и я вижу, что этот человек использовал some_ptr->canMessage_ptr[i].value;. Можно ли сделать это первым способом?

Выражение

some_ptr->canMessage_ptr[i].value

на 100% эквивалентно

(*(some_ptr->canMessage_ptr + i)).value

, что в свою очередь равно 100 % эквивалентен

(some_ptr->canMessage_ptr + i)->value

. Когда i равен 0 , это, конечно, эквивалентно

some_ptr->canMessage_ptr->value

Так что да, можно использовать some_ptr->canMessage_ptr->value, пока рассматриваемый индекс равен 0. Если индекс всегда 0, тогда цепочка операторов стрелок, как вы предполагаете, является хорошим стилем. В противном случае я рекомендую использовать комбинацию стрелок и операторов индексирования, которые вы видите на практике.

Мы часто используем указатели на структуры, содержащие указатель на другую структуру (как в примере ниже), но я никогда не вижу применения ptr1->ptr2->value?

Я склонен подозревать, что вы не до конца понимаете, с чем работаете. Использование формы some_ptr->canMessage_ptr[i].value предполагает, что ваш тип tSOMETHING содержит указатель на первый элемент массива , возможно, многих tCAN_MESSAGE с, что является тонким, но важным отличием. В этом случае, да, как показано выше, вы можете связать операторы стрелок для доступа к элементу first такого массива (с индексом 0). Однако самый чистый синтаксис для доступа к другим элементам этого массива состоит в использовании оператора индексации, и он платит за согласованность.

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