В C: Как установить указатель на элемент структуры, который является массивом?

Вот то, что я сделал:


Это дурачит Visual Studio в размышление, что Вы добавили таблицу стилей к странице, но это не становится представленным.

Вот еще более краткий способ сделать это с несколькими ссылками;

<% if (false) { %>
    
      
    

    

5 ответов

Вы уверены, что компилируете тот же код, который разместили здесь?

Если ваш компилятор жалуется в этой строке

p_data = &p_struct->DATA;

с сообщением «Ожидается член структуры / объединения», значит, ваш компилятор наверное сломан.

Обратите внимание, что & p_struct-> DATA является вполне допустимым выражением в C. Нет абсолютно никаких проблем с самим этим выражением.

Проблема в том, что это не то, что вам нужно в вашем случае. & p_struct-> DATA возвращает указатель на весь массив «DATA», то есть указатель типа unsigned char (*) [20] . Вы пытаетесь присвоить это значение указателю типа unsigned char * . Это недопустимо в C, поскольку типы совершенно разные, но традиционно компиляторы C ответили на это простым " На самом деле нет причин даже создавать указатель, который вы пытаетесь создать. Код будет отлично работать без какого-либо дополнительного указателя, просто откройте поле DATA напрямую

theCount = 0;
while (p_struct->DATA[theCount] != 0) {
  p_struct->DATA[theCount++] = 0;

(я бы, вероятно, использовал здесь для цикла ).

Если вы действительно настаивайте на создании этого указателя и продолжайте использовать индексный доступ, код должен выглядеть примерно так (другие уже предлагали это более одного раза)

p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
theCount = 0;
while (p_data[theCount] != 0) {
  p_data[theCount++] = 0;

Более того, вы можете выбрать более "экзотический" вариант:)

unsigned char (*p_data)[20]; /* <- note: declared differently */
...
p_data = &p_struct->DATA; /* <- note: your original version */
...
theCount = 0;
while ((*p_data)[theCount] != 0) {
  (*p_data)[theCount++] = 0;

Однако, возвращаясь к версии unsigned char * p_data , поскольку вы создаете этот указатель, может иметь смысл использовать технику «скользящего указателя» вместо использования доступа по индексу

unsigned char *p_data;
...
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
while (*p_data != 0) {
  *p_data++ = 0;

Как всегда, это все дело личных предпочтений. Конечно,

9
ответ дан 8 December 2019 в 17:23
поделиться

Вы должны написать одно из двух:

p_data = p_struct->DATA; // DATA is the address of the first element.

ИЛИ

p_data = &p_struct->DATA[0]; // taking the address of the first element.
2
ответ дан 8 December 2019 в 17:23
поделиться

Нет & в p_data = & p_struct-> DATA;

p_struct уже является указателем. После этого используйте p_data [] для доступа к вашему массиву.

3
ответ дан 8 December 2019 в 17:23
поделиться

Просто удалите & в начале, например:

p_data = p_struct->DATA;

Это специальный синтаксис для массивов (помните, что они всегда передаются как ссылка), и он эквивалентен:

p_data = &p_struct->DATA[0];

И да , теперь вы можете использовать * (pdata + 3)

Надеюсь, это поможет.

1
ответ дан 8 December 2019 в 17:23
поделиться

Ой! Спасибо AndreyT

struct DEV_STATUS * p_struct; беззнаковый символ * p_data; p_struct = & g_cmdQueue [queIdx]; p_data = & p_struct-> DATA;

p_struct - это указатель на struct DEV_STATUS .
& p_struct - адрес указателя на struct DEV_STATUS ( или указатель на указатель на структуру struct DEV_STATUS ).

Вы, вероятно, захотите изменить эту строку на

    p_data = p_struct->DATA;

О ... ваша функция clean_buffers () не выполняет " очистить "элемент g_cmdQueue [59] .

И, поскольку это глобальный объект, массив g_cmdQueue инициализируется всеми нулями даже до первого оператора main () исключения.

-1
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: