Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个参数传递到一个空指针参数的好方法?(C)_C_Parameter Passing_Void Pointers - Fatal编程技术网

将多个参数传递到一个空指针参数的好方法?(C)

将多个参数传递到一个空指针参数的好方法?(C),c,parameter-passing,void-pointers,C,Parameter Passing,Void Pointers,例如,在Python中,如果要将多个内容传递到一个参数中,只需传递一个元组,如下所示: thread_create(v, w, x, (y, z)) 我有一个想法,在另一个函数中传递一个指向我想要访问的东西的指针数组,但是它们的类型不同。有没有办法制作一个空指针数组或类似的东西 这个论点是void*类型的,我对这个概念有点陌生 执行与Python相同的操作:传递一个参数,该参数是由多个对象组成的复合对象。只是因为C是一种低级语言,所以需要手动管理一些事情。您需要为复合对象声明一个类型,需要确保

例如,在Python中,如果要将多个内容传递到一个参数中,只需传递一个元组,如下所示:

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, &param);
…
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, &param);

由于对象是动态分配的,因此您需要在某个时间点调用
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, &param);
…
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, &param);

由于对象是动态分配的,您需要在某个点调用
free
,大概是在
entry\u point
中,在它使用完对象之后。

是一个
struct
构造吗?哦,我没想到!
struct
是你要找的结构吗?哦,我没想到!