当一个指针到特定类型的(比如int,char,float,..)被递增,其值增加该数据类型的大小.如果void指向大小数据的指针x递增,它如何获得指向x前面的字节?编译器如何知道添加x指针的值?
是否可以在C编程语言中取消引用void指针而不使用类型转换?
另外,有没有任何方法可以概括一个可以接收指针并将其存储在void指针中的函数,并且通过使用该void指针,我们可以创建一个通用函数吗?
例如:
void abc(void *a, int b)
{
if(b==1)
printf("%d",*(int*)a); // If integer pointer is received
else if(b==2)
printf("%c",*(char*)a); // If character pointer is received
else if(b==3)
printf("%f",*(float*)a); // If float pointer is received
}
Run Code Online (Sandbox Code Playgroud)
我想在不使用if-else语句的情况下使这个函数变得通用 - 这可能吗?
此外,如果有很好的互联网文章解释了无效指针的概念,那么如果你能提供这些URL会很有用.
是否可以使用void指针进行指针算术?
假设我有以下代码:
void* my_alloc (size_t size)
{
return new char [size];
}
void my_free (void* ptr)
{
delete [] ptr;
}
Run Code Online (Sandbox Code Playgroud)
这样安全吗?或者必须在删除前ptr进行投射char*?
可能重复:
什么是void指针,什么是空指针?
我经常看到类似于以下内容的代码:
void * foo(int bar);
这是什么意思?这是否意味着它可以返回任何东西?这是类似dynamic或object在C#?
我有一个原型函数,void* myFcn(void* arg)用作pthread的起点.我需要将参数转换为int以供以后使用:
int x = (int)arg;
Run Code Online (Sandbox Code Playgroud)
编译器(GCC版本4.2.4)返回错误:
file.cpp:233: error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)
投这个的正确方法是什么?
最近,我看到这样的说法:
所有指针具有相同的大小是很常见的,但从技术上讲,指针类型具有不同的大小是可能的。
但后来我发现了这样的内容:
虽然指针的大小都是相同的,因为它们只存储内存地址,但我们必须知道它们指向什么类型的东西。
现在,我不确定以上哪种说法是正确的。第二个引用的语句看起来像是来自佛罗里达州立大学计算机科学的 C++ 笔记。
这就是为什么在我看来所有指针都应该具有相同的大小:
1)假设我们有:
int i = 0;
void* ptr = &i;
Run Code Online (Sandbox Code Playgroud)
现在,假设 C++ 标准允许指针具有不同的大小。进一步假设在某些任意机器/编译器上(因为标准允许),a 的void*大小为 2 字节,而 a 的int*大小为 4 字节。
现在,我认为这里有一个问题,即右侧有一个int*大小为 4 字节的 ,而左侧有一个void*大小为 2 字节的 。int*因此,当从到发生隐式转换时,void*将会丢失一些信息。
2)所有指针都保存地址。由于对于给定的机器,所有地址都具有相同的大小,因此所有指针也应该具有相同的大小是非常自然(合乎逻辑的)。
因此,我认为第二句话是正确的。
我的第一个问题是 C++ 标准对此有何规定?
我的第二个问题是,如果 C++ 标准确实允许指针具有不同的大小,那么有理由吗?我的意思是允许指针具有不同的大小对我来说似乎有点不自然(考虑到我上面解释的两点)。所以,我很确定标准委员会一定已经考虑到了这一点(指针可以有不同的大小),并且已经有理由允许指针有不同的大小。请注意,只有当标准确实允许指针具有不同的大小时,我才会问这个(第二个问题)。
c++ pointers void-pointers language-lawyer pointer-conversion
我正在使用void*在某些功能中接受的 API 。我经常不小心将错误的指针类型传递给函数,当然它编译得很好,但在运行时不起作用。
有没有办法禁用void*指向某个类的指针的隐式转换?
我试图理解这意味着什么,我正在看的代码
在.h
typedef void (*MCB)();
static MCB m_process;
Run Code Online (Sandbox Code Playgroud)
在.C
MCB Modes::m_process = NULL;
Run Code Online (Sandbox Code Playgroud)
有时当我做的时候
m_process();
Run Code Online (Sandbox Code Playgroud)
我得到了分段错误,这可能是因为内存被释放了,我怎样才能在它被释放时进行调试?
我希望我的问题很清楚.