c - 使用 pthread_create 时结构会丢失对变量的跟踪

标签 c multithreading memory struct pthreads

我正在尝试创建一个运行名为 csvSearch 的函数的新线程。该函数需要 3 条信息,因此我将它们放入一个结构中。

csvSearch 将 (void *) 作为其参数,当将该指针转换回指向该结构的指针时,不知何故我丢失了存储在 outpath 中的数据并且,结构的两个字段。

这是结构定义:

typedef struct {
    char path[256];
    char outpath[256];
    char column[32];
} Data;

创建线程时我使用了下面的代码

Data *data = malloc(sizeof(Data *));

strcpy(data->path, path);
strcpy(data->outpath, outpath);
strcpy(data->column, column);

pthread_create(&threads[threadCount], NULL, csvSearch, data);

这是 csvSearch 的摘要,我正在尝试调用的函数

void *csvSearch(void * data){

    Data * input = (Data *) data;

    char * path = input->path;
    char * outpath = input->outpath;
    char * column = input->column;

//path is the correct string, but outpath and column are both empty strings
}

我已经使用 gdb 对此进行了广泛的测试,但未能找到问题所在。我知道在 pthread_create 之前,数据包含正确的信息,并且当它被转换回 Data * 时我得到相同的内存地址和大小,但是 input->outpathinput->column 都用空字符填充。

我的语法有什么不正确吗?或者你不能通过这种方式将信息传递给新线程中的函数吗?

最佳答案

Data *data = malloc(sizeof(Data *));

正在为 Data* 而不是 Data 分配内存。您需要

Data *data = malloc(sizeof(Data));

关于c - 使用 pthread_create 时结构会丢失对变量的跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545154/

相关文章:

memory - 获取内存中的redis key-value大小

C预处理器它是如何工作的

objective-c - 非 Mac OS X 平台是否支持 Objective-C 2.0 异常处理?

c++ - Visual C++ 2008 Boost 问题

c# - 我是否需要自己在 xamarin.forms 中清理内存?

java : Get heap dump without jmap or without hanging the application

c++ - 如何在 Pro*C 中保持较低的实现/维护成本?

c++ - 如何在 C 中声明指向嵌套 C++ 类的指针

c - 在 C 中处理大数据集

java - 为什么关闭 Java Executor 时要保留中断状态?