void*以这样的方式定义,它可以指向任何东西.那么它可以用来指向一个函数(int send())吗?
int send();
void* p = send;
Run Code Online (Sandbox Code Playgroud)
可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?
假设一个函数将void指针作为参数,如下所示:int func(void *p);
我们如何确定或猜测p指向的类型?
是否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)
?
我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud) 我正在编写和读取内存映射中的寄存器,如下所示:
//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.
有没有办法将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函数. …
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
我有一个任意值的数组,所以我将它定义为一个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指针类型的变量?
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数组,并且稍后转换为所需类型将执行此工作,但对于稍后将阅读此代码的人来说可能会非常混乱.
我有一个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.
void-pointers ×10
c ×5
c++ ×5
pointers ×4
arrays ×1
c++11 ×1
casting ×1
destructor ×1
static-cast ×1
swift ×1