Как передать массив символов в функцию, ожидающую указатель 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() не записывает символы по адресу, указанному в &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 );
...
}