将多个参数传递到一个空指针参数的好方法?(C)
例如,在Python中,如果要将多个内容传递到一个参数中,只需传递一个元组,如下所示:将多个参数传递到一个空指针参数的好方法?(C),c,parameter-passing,void-pointers,C,Parameter Passing,Void Pointers,例如,在Python中,如果要将多个内容传递到一个参数中,只需传递一个元组,如下所示: thread_create(v, w, x, (y, z)) 我有一个想法,在另一个函数中传递一个指向我想要访问的东西的指针数组,但是它们的类型不同。有没有办法制作一个空指针数组或类似的东西 这个论点是void*类型的,我对这个概念有点陌生 执行与Python相同的操作:传递一个参数,该参数是由多个对象组成的复合对象。只是因为C是一种低级语言,所以需要手动管理一些事情。您需要为复合对象声明一个类型,需要确保
thread_create(v, w, x, (y, z))
我有一个想法,在另一个函数中传递一个指向我想要访问的东西的指针数组,但是它们的类型不同。有没有办法制作一个空指针数组或类似的东西
这个论点是void*类型的,我对这个概念有点陌生 执行与Python相同的操作:传递一个参数,该参数是由多个对象组成的复合对象。只是因为C是一种低级语言,所以需要手动管理一些事情。您需要为复合对象声明一个类型,需要确保一致地使用该类型,并且需要管理复合对象的内存。因此,它与Python中的概念核心相同,但在实践中要困难得多 C有静态类型,其类型系统没有结构聚合类型,因此需要为要传递的数据声明一个类型。假设要传递一个整数和一个字符
typedef struct {
int y;
char *z;
} thread_param_t;
调用线程创建函数时,需要创建此类型的对象并向其传递指针
thread_param_t param = {42, "hello"};
pthread_create(thread, attr, entry_point, ¶m);
…
pthread_join(thread, NULL);
运行线程代码的函数接受类型为void*
的参数。什么是void*
?这是在C中实现多态性的一种方法。指向void
的指针是一个没有说明它指向什么的指针。除了传递它之外,它不能直接使用,但是指向任何类型的指针都可以转换为指向void的指针,反之亦然。例如,pthread\u create
的第四个参数的类型为void*
,在上面我传递了一个thread\u param\u t*
类型的参数
void* entry_point(void *param_arg) {
thread_param_t *param = param_arg;
printf("entry_point called with y=%d and z=%s\n", param->y, param->z);
…
}
注意,C在运行时不携带类型信息。可以将指针转换为void*
并返回原始类型。将指针转换为void*
,然后再转换为指向其他类型的指针是不合适的,但如果您不小心这样做,您将不会得到一个很好的异常,如果幸运的话,您将得到一个崩溃,如果不这样做,则会出现内存损坏或其他难以调试的行为
此外,还需要管理参数对象使用的内存。上面,我演示了如何将参数对象声明为局部变量。如果将其放入函数中,则该对象仅在函数返回之前存在。(如果在块中声明了param
,则它仅在块的右大括号前有效。)如果函数等待线程完成对参数对象的访问,则可以这样做-上面我显示了它在等待线程结束。但通常这还不够好,所以需要动态分配内存
thread_param_t *param;
param = malloc(sizeof(*param));
if (param == NULL) …;
pthread_create(thread, attr, entry_point, ¶m);
由于对象是动态分配的,因此您需要在某个时间点调用
free
,大概是在entry\u point
中,在对象使用完毕后。您可以执行与Python相同的操作:传递一个由多个对象组成的复合对象的参数。只是因为C是一种低级语言,所以需要手动管理一些事情。您需要为复合对象声明一个类型,需要确保一致地使用该类型,并且需要管理复合对象的内存。因此,它与Python中的概念核心相同,但在实践中要困难得多
C有静态类型,其类型系统没有结构聚合类型,因此需要为要传递的数据声明一个类型。假设要传递一个整数和一个字符
typedef struct {
int y;
char *z;
} thread_param_t;
调用线程创建函数时,需要创建此类型的对象并向其传递指针
thread_param_t param = {42, "hello"};
pthread_create(thread, attr, entry_point, ¶m);
…
pthread_join(thread, NULL);
运行线程代码的函数接受类型为void*
的参数。什么是void*
?这是在C中实现多态性的一种方法。指向void
的指针是一个没有说明它指向什么的指针。除了传递它之外,它不能直接使用,但是指向任何类型的指针都可以转换为指向void的指针,反之亦然。例如,pthread\u create
的第四个参数的类型为void*
,在上面我传递了一个thread\u param\u t*
类型的参数
void* entry_point(void *param_arg) {
thread_param_t *param = param_arg;
printf("entry_point called with y=%d and z=%s\n", param->y, param->z);
…
}
注意,C在运行时不携带类型信息。可以将指针转换为void*
并返回原始类型。将指针转换为void*
,然后再转换为指向其他类型的指针是不合适的,但如果您不小心这样做,您将不会得到一个很好的异常,如果幸运的话,您将得到一个崩溃,如果不这样做,则会出现内存损坏或其他难以调试的行为
此外,还需要管理参数对象使用的内存。上面,我演示了如何将参数对象声明为局部变量。如果将其放入函数中,则该对象仅在函数返回之前存在。(如果在块中声明了param
,则它仅在块的右大括号前有效。)如果函数等待线程完成对参数对象的访问,则可以这样做-上面我显示了它在等待线程结束。但通常这还不够好,所以需要动态分配内存
thread_param_t *param;
param = malloc(sizeof(*param));
if (param == NULL) …;
pthread_create(thread, attr, entry_point, ¶m);
由于对象是动态分配的,您需要在某个点调用
free
,大概是在entry\u point
中,在它使用完对象之后。是一个struct
构造吗?哦,我没想到!struct
是你要找的结构吗?哦,我没想到!