Как передать массив символов в функцию, ожидающую указатель void*?

Я использую библиотеки termios.h и unistd.h для чтения из последовательного порта с помощью функции read(2).

      ssize_t read(int fd, void *buf, size_t count);

Следующий код отлично работает, вызывая функцию чтения:

      char read_buf [256];

int n = read(serial_port, &read_buf, sizeof(read_buf));

Теперь я пытаюсь создать функцию (readSerial), которая вызывает read() и передает ей указатель на read(). Я жестко запрограммировал «256» для устранения неполадок.

      void readSerial(char* msg) {
    int num_bytes;

    num_bytes = read(serial_port, &msg, 256);
}

void main(void) {

char serial_rmsg[256] = {0};

readSerial(serial_rmsg);
printf(serial_rmsg , "%s");
}

Я не могу понять, как передать массив символов в readSerial так, чтобыаргумент read(2) примет его.

Я попробовал приведенный выше код, и read() не записывает символы по адресу, указанному в &msg.

1 ответ

Изначально вы передали указатель на массив. Но в равной степени допустимо передать указатель на элемент массива. Оба они указывают на одно и то же место. У них разные типы, но это не имеет значения, поскольку мы (неявно) приводим указатель кvoid *.

И именно поэтому изначально вы могли бы использовать следующее:

      char read_buf[256];

int n = read( serial_port, &( read_buf[0] ), sizeof( read_buf ) );

Массив, используемый в качестве указателя, вырождается в указатель на свой первый элемент, поэтому его также можно записать следующим образом:

      char read_buf[256];

int n = read( serial_port, read_buf, sizeof( read_buf ) );

И это именно то, что вы делаете, когда звонитеreadSerial.

      readSerial( serial_rmsg, sizeof( serial_rmsg ) )

это сокращение от

      readSerial( &( serial_rmsg[0] ), sizeof( serial_rmsg ) )

Другими словами, вы уже передаете указатель. Итак, ваша функция должна выглядеть просто так:

      void readSerial( char* msg, size_t n ) {
   ...
   num_bytes = read( serial_port, msg, n );
   ...
}
Другие вопросы по тегам