C 作为参数传递给线程的结构的未定义字段

C 作为参数传递给线程的结构的未定义字段,c,C,我以这种方式声明和分配了一个结构 typedef { char* a; char* b; int c; int d; FILE *e; } t; [...] ready= malloc(sizeof(t)); strncpy (ready->a, ss1, length); strncpy (ready->b, ss2, length); ready->c= f; ready->d= g; ready->e= f

我以这种方式声明和分配了一个结构

typedef {
      char* a; char* b; int c; int d; FILE *e;
} t;
[...]

    ready= malloc(sizeof(t));
    strncpy (ready->a, ss1, length);
    strncpy (ready->b, ss2, length);
    ready->c= f; ready->d= g;
    ready->e= fopen(file, "w");
我想传递给一个线程

pthread_create(thread_id, NULL, worker_start, &ready);
当我开始在线程函数中做一些事情时,很明显,在调用create之前我在main中初始化的字段没有在线程中定义

void* worker_start(void *param) {
    t *current;

    current = (t*) param;
    ...
}

代码怎么了?我在这里做了什么坏事吗?

一个问题是文件a和b是指向字符的指针,不为字符分配内存

要么就把它们指向弦

ready->a =  ss1;
ready->b =  ss2;
ready->a = strdup( ss1 );
ready->b = strdup( ss2 );
或者复制字符串

ready->a =  ss1;
ready->b =  ss2;
ready->a = strdup( ss1 );
ready->b = strdup( ss2 );

另一个问题是,根据@JoachimPileborg的回答,当您将指针传递给线程时,您将其作为指向指针的指针传递(因为您使用了操作符
的地址)。您不需要这样做,并且在线程函数中,您不会将其视为指向指针的指针,而只是普通指针


在创建线程时,删除符号(
&
),事情应该会更好。

准备就绪->a
准备就绪->b
指向哪里?看起来您的书写是通过未初始化的指针完成的。

正如Joachim Pileborg所说,您不应该将指针传递给指针

只要做:

pthread\u create(线程id,NULL,辅助线程启动,就绪)

不要忘记使用关键字STRUCT:

typedef struct t_type {
 char* a; char* b; int c; int d; FILE *e;
} t;

您没有在代码中显示它,但也为字符串分配了内存?在
typedef
之后缺少
struct
关键字。永远不要输入你的代码。总是剪贴。很抱歉这么叫。你说的“未定义”是什么意思?我确实为字符串分配了内存,我为缺少未定义的代码感到抱歉。我的意思是字符串字段的printf结果类似于�@��˿��˿:而且这些数字并不是我期望的数字。写在文件里给我Seg错误!这对我来说听起来是个好办法。但是,对不起,我的朋友,它不起作用(@Janinho67您可以做一件简单的事情来检查它是否是发送到线程的正确指针:
printf(“%p\n”,就绪)
在线程中执行相同的操作,并比较两个指针。如果两个指针不相等,则说明您做错了什么。还要检查在使用它们之前,您是否
释放了任何指针。这不是重点。重点是,成员a和b是否已初始化?不能将未初始化的指针用作strcpy()的目标。