使用结构作为线程参数调用 pthread_create 时出现额外字符

问题描述 投票:0回答:1

我观察到,当我将一个结构作为参数传递给线程时,该结构的字符串成员在线程内长了几个字符。

所以基本上,在 main 中,s-dev 有 12 个字符长。当 s 作为参数传递给 pthread_create 时,s->dev 变成 14 个字符长。什么会破坏字符串?谁能解释一下原因?

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void *rtu_worker(void *ptr);

typedef struct mb_serial_dev_config
{
    char parity;
    char *dev;
    uint8_t databits;
    uint8_t stopbits;
    uint32_t baudrate;
} mb_serial_dev_config_t;


int main(int argc, char *argv[])
{
    int r_th = 0;
    pthread_t rtu_thread;
    mb_serial_dev_config_t *s = (mb_serial_dev_config_t *)malloc(sizeof(mb_serial_dev_config_t));

    //com1 config
    char *serial_device = "/dev/ttyUSB1";
    int32_t baud = 9600;
    char parity = 'N';
    int32_t databits = 8;
    int32_t stopbits = 1;

    s->dev = (char *)malloc(strlen(serial_device));
    strcpy(s->dev,serial_device);
    s->parity = parity;
    s->baudrate = baud;
    s->databits = databits;
    s->stopbits = stopbits;

    printf("%s(%d)\n",s->dev, strlen(s->dev));
    r_th = pthread_create(&rtu_thread, NULL, rtu_worker, s);
    printf("Waiting on threads ...");
    pthread_join(rtu_thread, NULL);
    printf("exiting the main application ...\n");
}

void *rtu_worker(void *ptr)
{
    int count = 0;
    mb_serial_dev_config_t *d = (mb_serial_dev_config_t *)ptr;

    printf("%s(%d)\n",d->dev, strlen(d->dev));

    //print the device name character by character
    while(count < strlen(d->dev)){
        printf("(%d)  %c (%d)\n", count, (d->dev)[count], (d->dev)[count]);
        count++;
    }
}
c malloc pthreads c-strings strlen
1个回答
1
投票

你忘了为字符串的终止零字符

'\0'
预留内存

s->dev = (char *)malloc(strlen(serial_device) + 1);
strcpy(s->dev,serial_device);

注意函数

strlen
的返回类型是
size_t
。因此,在
printf
的调用中,您需要使用转换说明符
zu
而不是
d
like

printf("%s(%zu)\n",s->dev, strlen(s->dev));

此外,函数

rtu_worker
不返回任何内容,尽管它的返回类型不是
void
.

void *rtu_worker(void *ptr)
© www.soinside.com 2019 - 2024. All rights reserved.