将几个参数传递到一个无效的指针论点的好方法? (c)

问题描述 投票:0回答:2

,例如,在Python中,如果您想将几件事传递到一个参数中,则可以通过以下元素进行元素:

thread_create(v, w, x, (y, z))
我有一个想法将一系列指针传递给我想在其他功能中访问的东西,但它们具有不同的类型。有没有办法制作一系列空隙指针或类似的东西?

论点是void*类型,这是我真的不熟悉的概念。

c parameter-passing void-pointers
2个回答
1
投票
您做的事情与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
的指针是一个没有说明其指向的指针。除了将其传递到其他类型的指针外,它不能直接使用,但是可以将其转换为无效的指针,反之亦然。例如,第四个参数为
pthread_create
具有类型
void*
的类型,上面我传递了类型
thread_param_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

,大概是在使用对象完成后。
    

您无法创建一系列voids,因为void不是类型的说明符。数组必须具有指定的类型(例如,char,unsigned int等),而void的作用是它抽象了指针的类型,以便您可以将指针转换回您想要的任何类型。
一个参数使用类型转换e时传递多个值的简便方法。 G.

entry_point

unsigned long param = {(unsigned long)y, (unsigned long)z};
thread_create(v, w, x, (void *)param);
变量的type应该足够大,可以在其中存储类型的元素(不要使用
param

数组来存储

0
投票
在其中)。这种方法的缺点是它可能需要更多的内存。因此,将多个值传递给参数的更好方法是使用

int

。 E.G.
struct

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.