问题标签 [void-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2642 浏览

objective-c - 在没有 stringWithCString 的情况下将 void* 转换为 NSString*

我有一个与钥匙串交互的程序。你传入一个指向 void 指针的指针,我猜钥匙串将它指向密码,你还传入一个 UInt32 指针,它将指向密码的长度。

然后我需要将其用作 NSString,我尝试直接将其转换为这样,但它聚合了所需的更多位,并且不适用于密码。我尝试使用:

这将密码更改为类似中文的字符。不知道为什么。当我在调试模式下打印描述时,它给了我:

我能够让它完美地工作:

但这是折旧的,我想避免使用它。我对 C 和 Objective-C 都很陌生,void 指针让我陷入循环。在调试模式下,我查看了指针指向的内存,它肯定在那个内存位置。我尝试使用 const char* 但它不喜欢这样说变量可能尚未初始化。

这是我用来获取钥匙串的方法

有没有办法让 NSString 以正确的长度指向那里并让它成为正确的东西。谢谢您的帮助。这个地方很棒!

0 投票
4 回答
2124 浏览

c - C 问题:对 void** 双间接指针的单次取消引用

我收到了这条消息:

当我试图编译类似这样的东西时:



在阅读有关堆栈溢出的这个问题后,我发现了我认为的解决方案:
避免不兼容的指针警告在处理双重间接时 - 堆栈溢出

所以我调整为这样的内容:

这是合法的C吗?我正在取消引用一个 void 指针,不是吗?

谢谢大家


编辑 2010 年 12 月 10 日下午 4:45 EST:
正如已经指出的那样,它free(NULL)是安全的并且被 C 标准覆盖。此外,如下所述,我上面的示例是不合法的 C。请参阅 caf 的答案、Zack 的答案和我自己的答案。

因此,我将更容易将任何要被 malloc 的指针初始化为 NULL,然后在代码中直接将 free() 和 NULL 初始化为:

我像以前一样在 myfree() 中检查 NULL 的原因是因为我使用 fclose() 的经验。fclose(NULL)可以根据平台(例如 xpsp3 msvcrt.dll 7.0.2600.5512)发生段错误,所以我假设(错误地)同样的事情可能发生在 free() 上。我想,与其用 if 语句弄乱我的代码,我可以更好地在函数中实现。

谢谢大家的好讨论

0 投票
5 回答
1201 浏览

c - 在 C 中使用 void * 代替重载?

我的问题是我在多线程应用程序中看到过这样的代码:

这极大地引起了我的兴趣,我知道malloc发回一个 void 指针,你可以将它转换为你想要的,这是否意味着我可以创建一个可以接受任何数据类型的函数?

例如我写的一个没有测试的函数:

我可能完全错了,即使这确实有效,这是可怕的做法吗?谢谢。

0 投票
3 回答
1553 浏览

c++ - 将 Int 作为 void* 传递,然后获取值

我正在使用一个 Timer 类,该类将 void* 作为可选参数传递给回调。我需要传递一个整数,但我的逻辑似乎并不顺利。

在 Event_PlayerSpawn() 我有一个 int* clientIndex 指向 int“客户端”的内存位置。我将它传递给 void* 参数,然后在回调中将其再次转换为 int*,然后取消引用它以获取值。我到底哪里错了?

0 投票
4 回答
3797 浏览

c - 你如何从位域转换为指针?

我编写了以下代码,它产生了

警告:初始化使指针从整数而不进行强制转换

警告:从不同大小的整数转换为指针

来自 gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)

如何让警告消失?无论我尝试过什么投射,似乎总是会出现警告。

谢谢,陈兹

0 投票
2 回答
11241 浏览

c - C 取消引用 void* 指针

我是 C 新手,对于我的第一个项目,我需要实现一个基于数组的队列。

我希望我的队列能够保存任何类型的对象,因此我创建了一个 QueueElement 结构来保存指向任何类型对象的 void 指针。我认为一切正常,除了我无法从我的 QueueElement 结构中读取“位置”和“值”字段。尝试编译时出现以下错误。

错误:

我很确定我只是没有正确投射。任何帮助表示赞赏。

再次感谢,狗

可运行的.c

队列.h

队列.c

队列元素.h

队列元素.c

0 投票
1 回答
2114 浏览

c++ - boost::variant 和 void* 指针

我需要一个包含任何用户定义类的实例的变体类型。所以我使用 void*:

我用地图创建了一个包装类:

使用示例:

这个 void* 在变体类中有两个问题:

  1. 使用指向动态分配内存的指针复制属性是危险的并且容易出错。
  2. 用户可以将 void* 静态转换为 WrongClass*,而不是 MyClass*。它编译,但结果是不可预测的。

可能的解决方案:

  1. 使用 boost::shared_ptr< void* >。
  2. 记住所有 void* 值(添加时)的 typeid std::map<void*, typeid> typeid_map。当用户请求 void* 值,将其转换为任何 TClass* 时,让我们评估一个断言:assert(typeid_from_typeid_map == typeid(TClass*))

问题
1. 是否有其他解决方案来保存任何用户定义类的值?
2. 可能你会为提到的问题推荐更好的解决方案并指出其他一些问题?

0 投票
0 回答
1673 浏览

c - C:为什么从 void 指针转换为未定义的函数指针?

可能重复:
为什么 C/C++ 中的函数指针和数据指针不兼容?

在 dlsym 的手册页中,提供了以下代码段。

我查看了相关的规范页面,但仍然无法理解不允许从 void 指针转换为函数指针的原因。void 指针是否应该足够大以容纳所有类型的指针。如果是这样,为什么不定义这个铸造?

0 投票
4 回答
637 浏览

c - 如何将结构中的多个 void 指针取消引用到 1 块内存中?

我正在做一个项目,我需要通过某个 IPC 堆栈(在我的情况下为 LCM)发送,问题是我需要为 IPC 提供一个可变长度的结构。我有

我有一个指向 pack2 的指针,我需要像序列化这样的东西,所以我可以pack2通过网络将它发送到另一个进程。

有谁知道怎么做?

0 投票
3 回答
3338 浏览

c - 如何通过函数修改指向 void 的指针?

我正在尝试创建一个链接列表,您可以在其中更新节点中的数据,但无论我尝试什么,C 似乎都不允许我更新 void 指针的值(或者更确切地说它指向的位置) . 这是我的测试代码:

仅输出::

我在这里遗漏了一些明显的东西吗?我也尝试过使用指向指针的指针,但无济于事。