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()的目标。