调用pthread_create传递结构体参数时字符串出现额外字符问题
问题原因及修复方案
核心问题:内存分配未预留字符串结束符空间
你遇到的字符串长度异常,本质是内存越界写入引发的未定义行为:
strlen("/dev/ttyUSB1")返回12,这是字符串的有效字符数,但C语言字符串必须依赖末尾的'\0'作为结束标记- 你用
malloc(strlen(serial_device))仅分配了12字节内存,而strcpy会把源字符串的12个有效字符加上'\0'共13字节数据拷贝进去,直接越界写入1字节 - 越界的
'\0'会破坏相邻内存区域的数据,后续线程中调用strlen时,会一直读到内存中随机出现的'\0'才停止,所以长度变成了14
修复代码
只需修改内存分配逻辑,为'\0'多预留1字节空间:
// 原代码 s->dev = (char *)malloc(strlen(serial_device)); // 修改后 s->dev = (char *)malloc(strlen(serial_device) + 1);
更简洁安全的方式是用strdup,它会自动计算所需内存并完成拷贝:
s->dev = strdup(serial_device);
另外,程序结束前记得释放分配的内存,避免泄漏:
// 在main函数末尾添加 free(s->dev); free(s);
内容的提问来源于stack exchange,提问作者trexde
相关产品推荐
相关产品推荐

