如何将字符数组传入接收void*指针的函数?(串口read场景)
串口读取函数封装的问题修复
核心错误分析
错误1:read的buf参数传递错误
在readSerial函数中,msg本身就是指向serial_rmsg数组的指针,你却传入了&msg——这会把指针变量自身的内存地址传给read,导致串口数据被写入指针变量的位置,而非目标数组。正确的做法是直接传递msg。错误2:printf调用参数顺序颠倒
printf(serial_rmsg , "%s");的写法完全不符合函数规范,printf要求第一个参数是格式字符串,第二个才是要输出的变量,正确写法为printf("%s", serial_rmsg);。额外隐患:未处理字符串终止符与读取错误
read函数不会自动在读取的字节后添加\0,直接用printf("%s")输出会导致读取到内存垃圾数据;同时未检查read的返回值,无法判断读取是否成功。
修正后的代码
#include <unistd.h> #include <stdio.h> #include <termios.h> // 假设serial_port是已正确初始化的串口文件描述符 int serial_port; void readSerial(char* msg) { ssize_t num_bytes; // 直接传递msg,指向目标数组的起始地址 num_bytes = read(serial_port, msg, 255); // 预留1字节给字符串终止符 if (num_bytes > 0) { // 添加字符串终止符,确保printf能正确识别字符串结尾 msg[num_bytes] = '\0'; } else if (num_bytes == -1) { // 打印读取错误信息,避免后续输出异常 perror("read failed"); msg[0] = '\0'; } } int main(void) { char serial_rmsg[256] = {0}; readSerial(serial_rmsg); // 修正printf参数顺序,添加换行符优化输出 printf("%s\n", serial_rmsg); return 0; }
关键修正说明
- 将
&msg改为msg,让read直接写入目标数组的内存空间; - 限制read的读取长度为255,预留一个字节存储
\0,避免数组越界; - 处理read的返回值:成功时添加字符串终止符,失败时打印错误并清空数组;
- 调整printf的参数顺序,符合函数调用规范。
内容的提问来源于stack exchange,提问作者GHall
相关产品推荐
相关产品推荐

