标签: void-pointers

can void*用于存储函数指针?

void*以这样的方式定义,它可以指向任何东西.那么它可以用来指向一个函数(int send())吗?

int send();
void* p = send;
Run Code Online (Sandbox Code Playgroud)

可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?

c c++ function-pointers void-pointers

14
推荐指数
2
解决办法
3079
查看次数

C:来自void指针的外推类型

假设一个函数将void指针作为参数,如下所示:int func(void *p);
我们如何确定或猜测p指向的类型?

c pointers void-pointers

13
推荐指数
3
解决办法
8811
查看次数

删除vs运算符删除(和void指针)

是否delete ptr不同于operator delete(ptr)仅在于此,即delete调用ptr析构函数?或者换句话说,delete ptr首先调用析构函数ptr然后operator delete(ptr)释放已分配的内存吗?然后在delete ptr技术上等同于以下内容:

T * ptr = new T;

//delete ptr equivalent:
ptr->~T();
::operator delete(static_cast<void *>(ptr));
Run Code Online (Sandbox Code Playgroud)

c++ destructor void-pointers delete-operator

13
推荐指数
1
解决办法
1519
查看次数

在不同平台上使用void指针

我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?

int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud)

c pointers void-pointers format-specifiers

13
推荐指数
3
解决办法
976
查看次数

警告:算术中使用的'void*'类型的指针

我正在编写和读取内存映射中的寄存器,如下所示:

//READ
return *((volatile uint32_t *) ( map + offset ));

//WRITE
*((volatile uint32_t *) ( map + offset )) = value;
Run Code Online (Sandbox Code Playgroud)

但是编译器给了我这样的警告:

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
Run Code Online (Sandbox Code Playgroud)

如何更改我的代码以删除警告?我正在使用C++和Linux.

c++ pointers void-pointers pointer-arithmetic

13
推荐指数
2
解决办法
2万
查看次数

将Swift结构转换为UnsafeMutablePointer <Void>

有没有办法将Swift结构的地址强制转换为void UnsafeMutablePointer?
我尝试了这个没有成功:

struct TheStruct {
    var a:Int = 0
}

var myStruct = TheStruct()
var address = UnsafeMutablePointer<Void>(&myStruct)
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:
我实际上尝试移植到Swift 的上下文Learning CoreAudio中的第一个示例.
这是我到目前为止所做的事情:

func myAQInputCallback(inUserData:UnsafeMutablePointer<Void>,
    inQueue:AudioQueueRef,
    inBuffer:AudioQueueBufferRef,
    inStartTime:UnsafePointer<AudioTimeStamp>,
    inNumPackets:UInt32,
    inPacketDesc:UnsafePointer<AudioStreamPacketDescription>)
 { }

struct MyRecorder {
    var recordFile:     AudioFileID = AudioFileID()
    var recordPacket:   Int64       = 0
    var running:        Boolean     = 0
}

var queue:AudioQueueRef = AudioQueueRef()
AudioQueueNewInput(&asbd,
    myAQInputCallback,
    &recorder,  // <- this is where I *think* a void pointer is demanded
    nil,
    nil,
    UInt32(0),
    &queue)
Run Code Online (Sandbox Code Playgroud)

我正在努力留在Swift,但如果事实证明这是一个问题而不是一个优势,我将最终链接到一个C函数. …

casting unsafe-pointers void-pointers swift

13
推荐指数
1
解决办法
8173
查看次数

为什么operator void*()转换函数被添加到C++流类中?

operator void*() constC++流类中有一个转换函数.这样所有流对象都可以隐式转换为void*.在与SO的程序员交互过程中,他们建议我不要使用,void*除非你有充分的理由使用它.void*是一种删除类型安全和错误检查的技术.因此,由于该转换功能的存在,以下程序完全有效.这是C++标准库中的一个缺陷.

#include <iostream>
int main()
{
       delete std::cout;
       delete std::cin;
}
Run Code Online (Sandbox Code Playgroud)

在这里查看现场演示.

上述程序在C++ 03中有效,但在C++ 11及更高版本的编译器中编译失败,因为此转换函数已被删除.但问题是,如果它是危险的,它是C++标准库的一部分?允许将流对象转换为的目的是void*什么?有什么用?

c++ void-pointers c++-standard-library delete-operator c++11

13
推荐指数
2
解决办法
1902
查看次数

如果我有一个void指针,我该如何将int放入其中?

我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int字符数组等).但是,我如何实际分配int给它?

以这些初始化为例:

void* data[10];
int x = 100;
Run Code Online (Sandbox Code Playgroud)

我的直觉会想到这一点,但这会产生编译错误:

data[0] = malloc(sizeof(int));
*(data[0]) = x;
Run Code Online (Sandbox Code Playgroud)

我也考虑过使用&x,但我会考虑一个局部变量的地址,这个(据我的理解)将在退出程序后被清除.所以,如果我有一个局部变量x,我如何正确地将它变为void指针类型的变量?

c pointers void-pointers

12
推荐指数
2
解决办法
2万
查看次数

void类型的数组

plain C有很好的功能 - void类型指针,可以用作指向任何数据类型的指针.
但是,假设我有以下结构:


struct token {
    int type;
    void *value;
};
Run Code Online (Sandbox Code Playgroud)

其中value字段可以指向char数组,或指向int或其他内容.
所以在分配这个结构的新实例时,我需要:

1)为这个结构分配内存;
2)为值分配内存并将其分配给值字段.

我的问题是 - 有没有办法声明" 类型为void的数组 ",它可以被转换为任何其他类型,如void指针?

我想要的只是使用"灵活的成员阵列"(在C99标准的6.7.2.1中描述),能够投射到任何类型.

像这样的东西:


struct token {
    int type;
    void value[];
};

struct token *p = malloc(sizeof(struct token) + value_size);
memcpy(p->value, val, value_size);
...
char *ptr = token->value;

Run Code Online (Sandbox Code Playgroud)

我假设将token-> value声明为char或int数组,并且稍后转换为所需类型将执行此工作,但对于稍后将阅读此代码的人来说可能会非常混乱.

c arrays void-pointers

12
推荐指数
2
解决办法
3万
查看次数

为什么我需要reinterpret_cast将Fred**const转换为void**const?

我有一个const指针指向一个指针Fred,我不明白为什么一个static_cast是不够的.

typedef struct {
    int n;
} Fred;

Fred *pFred;
Fred **const ppFred = &pFred;
void **const ppVoid = static_cast<void ** const>(ppFred);
Run Code Online (Sandbox Code Playgroud)

请有人能解释为什么reinterpret_cast需要一个指针转换Fred*为指针void*,但是static_cast是精指针转换Fred为指针void.

c++ void-pointers static-cast reinterpret-cast

12
推荐指数
1
解决办法
572
查看次数