gpt4 book ai didi

c - 使用带有 void 指针参数的函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:14 24 4
gpt4 key购买 nike

我是一名尝试链表的 C 初学者,我找到了一个 Github 存储库。创建函数是这样写的:

Node* ListCreate(void* data) {
Node *head = malloc(sizeof(Node));
if ( head != NULL) {
head->next = NULL;
head->data = data;
}
return head;
}

我可以通过将 void* 更改为 int 然后在 main 中执行以下操作来使用它:

Node *root = ListCreate(5);

但后来我阅读了一些有关 void 指针的内容,它们似乎可以用作类似于 C++ 模板的通用类型,如果我能弄清楚它们的工作原理,这将很有用。我尝试了几件事,最接近它正常工作的是没有错误,但有一个警告:

将“int”传递给“void *”类型参数的指针转换不兼容的整数

我是不是漏掉了一步?我首先觉得我应该在函数定义中添加一些东西,但我假设编写它的人知道他们在做什么,而我只是没有在 main 中正确使用它。那么我应该用不同的方式将参数传递给这个函数吗?

最佳答案

正如其他人在评论中提到的,为不同的类型创建不同的列表更合适。

但是如果你想使用相同的函数定义,那么使用可以将指针传递给你的数据(intchar)并将它们转换为 void *

/* main: start */
int main(void)
{
Node *list_head; /* Points to first element in list */
Node *node_tmp; /* Just a temporary pointer */

int *pint;
char *pchar;

/* create an empty list */
list_head = NULL;

/* Note that there is no error checking done for
* malloc, which is not good
*/

/* Create a node which points to int */
pint = malloc(sizeof(int));
*pint = 10;
node_tmp = ListCreate((void *) pint);
/* Add this node to list */
list_head = add(node_tmp, list_head);

/* Create a node which points to char */
pchar = malloc(sizeof(char));
*pchar = 'c';
node_tmp = ListCreate((void *) pchar);
/* Add this node to list */
list_head = add(node_tmp, list_head);

/* print total number of nodes in list */
print_tot_nodes(list_head);
return 0;
}

addprint_tot_nodes 的代码被省略是为了简洁。

请注意,如果 data 指向不同的数据类型,则像 print_tot_nodesadd 这样的函数不会有太多问题。但是,如果您需要实现像 Node *smallest(Node *head) 这样的函数,它返回指向具有最小元素的节点的指针,那么它可能会变得复杂。

因此,对于不同的类型使用不同的列表更容易。但是,如果您需要使用与原始帖子中相同的函数定义,则可以将指向某些数据类型的实际指针强制转换void *

关于c - 使用带有 void 指针参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38176266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com