首页 > 解决方案 > 整数到无效 * ?什么是最好的方法

问题描述

我已经看到很多关于将整数类型转换为 void * 的主题,但我仍然无法理解为什么它可以在不强制转换的情况下工作,以及为什么解决这些警告如此耗时,至少在我看来是这样。

我试图使这个主题尽可能小,但试图解释一切,但我认为解释我所做的步骤,我是如何尝试这样做的等等。人们更容易理解我的问题。

我正在使用链表,我的结构是:

typedef struct list_t {
    struct list_t *prev;
    void *data;
    struct list_t *next;
}list_s;

一开始,我只是将data类型设置为整数,因为我总是在我的程序中使用整数。我唯一的问题是如果我想将数据值设置为 NULL 以检查我的链表中是否有某些东西(如果我已经使用过一次)。

有些人会说"just set it to zero",但我的列表中可能有一个零值,所以在某些时候可能会出现错误。

我想过just setting a variable诸如此类"has_list_been_already_used"或类似的事情,但我认为它只会让我的代码变得更大,而只是徒劳无功。

收到此警告后,我的第一个想法是:

warning: assignment to ‘void *’ from ‘int’ makes pointer from integer without a cast

是:“哦,我只是将它转换为 void * like (void*)my_atoi(datastring);,就是这样。

但我收到另一个警告:

warning: cast to pointer from integer of different size

在这一点上,我不知道该怎么做,也没有真正发现以这种方式进行类型转换的任何问题。另一方面,我找到了另一种方法,但我想知道这是否是正确的做法,以及是否有另一种方法不会导致修改我的几乎所有代码并对其进行扩展。让我解释 :

有人说你可以这样integersvoid *

int x = 10;
void *pointer = &x;

并在代码中检索它,例如:

int y = *((int *) pointer);

在我的代码中,无论我在哪里从我的结构中检索我的数据,我都必须这样做。

这真的是我唯一的选择吗?以及为什么只是将它从 an 类型转换integer为 avoid*并不能完成这项工作,特别是如果它“运行良好”,但确实有警告。

谢谢。

标签: ccastinglinked-listintegervoid-pointers

解决方案


类型转换指针通常不会在内部做任何事情。但是,它告诉您的编译器将指针视为类型化指针。

所以指针就是字面意思。它指向记忆中的一个地方。并且在那个地方存储什么类型的对象并不总是已知的。您可以通过强制转换告诉编译器它是一个整数: ( int* iptr = (int*) voidptr) 现在您的编译器将读取指针指向的内存位置,就好像它是一个整数一样。如果不是整数,就会得到乱码数据。

现在这个例子:

int x = 10;
void *pointer = &x;

这没关系,因为你说“使指针(指向任何东西)形成这个指向 int 的指针”这没关系,因为指向 int 的指针总是指向任何东西。但是,如果您以其他方式执行此操作,则必须明确表示您确定那里存储了一个 int ,因为编译器不知道。

如果你愿意,你可以创建一个整数链表。那么你甚至不需要使用指针。只需将整数放在结构中而不是void*. 以这种方式编写此链表结构的原因是它允许使用任何类型的数据或数据结构。这就是为什么他们在 C++ 中添加模板之类的东西。(但我们现在正在谈论 c)

正确的c方法可能是制作一个像

#define declare_LL_type(type) ...

这将使自定义类型的链表结构定义。


推荐阅读