基本上我想要做的是,根据一些变量,将void指针转换为不同的数据类型.例如('cast'变量只是为了得到我的观点):
void* ptr = some data;
int temp = some data;
int i = 0;
...
if(temp == 32) cast = (uint32*)
else if(temp == 16) cast = (uint16*)
else cast = (uint8*)
i = someArray[*((cast)ptr)];
Run Code Online (Sandbox Code Playgroud)
C++中有什么东西可以做这样的事情(因为你实际上不能将变量分配给(uint32*)或类似的东西)?如果不清楚我会道歉,任何帮助将不胜感激.
我有以下代码:
void funcA(void* pArg)
{
STRUCTA abc;
.
. // Some processing here
.
if (pArg)
(STRUCTA *)pArg = abc;
}
Run Code Online (Sandbox Code Playgroud)
问题是,这段代码抛出了以下警告:警告:赋值目标不是真正的左值; 这将是一个艰难的错误
如果没有演员阵容,我会再次发出警告,我正试图取消引用无效指针......
由于警告被视为错误,我无法使用此代码 - 但我真的不能使用任何其他指针类型而不是void*作为参数.我缺少一个优雅的解决方案吗?
有没有办法让这项工作?
在我们的代码中,我们有一个混合类型的大结构,并希望为这些存储默认值的重复(const)结构.
当用户想要默认设置时,能够通过在结构中获取项的地址偏移量来实现这一点,然后在"defaults"结构中分配具有相同偏移量的值,这样会很好像这样:
void *setting = &settings->thing; // Points to a setting
int offset = setting - &settings;
void *default = &defaults_struct + offset; // Points to the default value
*setting = *default; // Set setting to default value
Run Code Online (Sandbox Code Playgroud)
想法是如果settings-> thing指向int8,则从默认值复制int8值,但如果settings-> other_thing是int32,则复制完整的32位.
问题是,如上所述,这是否适用于无效指针?如果没有,有没有办法做到这一点?我错过了更好的实现方法吗?
编辑澄清:我们希望在结构中将单个值设置为"defaults"结构中的相应值.
如何释放void指针.
struct vStruct {
void *vPtr;
struct vStruct *next;
};
struct vStruct sObj;
struct vStruct *sObjNew = sObj;
delete sObjNew->vPtr; -----------> Is this correct way to delete void pointer
delete sObjNew;
Run Code Online (Sandbox Code Playgroud)
显示错误运算符'delete',应用于具有未定义行为的void*参数,并且很可能不会调用对象的析构函数.
这是对这个问题的跟进: 有一个函数改变指针在C中表示的值
作为练习,我试图创建一个通用函数来更改未确定类型的数组中的值.我猜它应该是这样的.
void set_value(void * data, void * value, size_t size, int index){
void * position = data + index*size;
*position = *value;
}
Run Code Online (Sandbox Code Playgroud)
当然不编译,*position =*value不使用值大小的信息(这里假设数据和值都指向size_t大小的smthg).
我想对我的程序说的是:"获取按值指向的大小的内存块并将其复制到位置指向的地址"
此函数检查第一个参数是否为偶数,如果是,则将该值添加到第二个参数.它使用void*,我必须转换为int,但我遇到语法问题以及如何正确转换,并使用指针.
bool isEven(void *x, void* z) {
int * a = (int *)x;
int * b = (int *)z;
bool result = false;
if (*a % 2) {
result = true;
b += a;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的语法有什么问题?我在"a"下说"表达式必须有整数或枚举类型"时出错
基本问题:在运行时是否有可移植(或至少是大多数编译器中的库)方式来查询void*指针的类型?特别是,是否可以确定指针是struct x类型还是struct y类型(作为示例).
附加信息:我知道gcc提供了typeof操作符,但我想要一个更便携,更少编译器依赖的方式来完成同样的事情.
要求:
不能完全依赖于编译器.这包括特定于编译器的宏以及大多数编译器中通常不实现的其他功能.
我更喜欢一个适用于任何编译器的函数,而不是任何可移植的实现(尽管我会接受最适合我目标的答案).
建议在库中使用不在C11函数中的函数,但在大多数编译器中都常见.确保你解释它是如何工作的和参数.
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
void *x;
int arr[10];
x = arr;
*x = 23; //This is where I get the error
}
Run Code Online (Sandbox Code Playgroud)
如您所见,代码非常简单.它只是创建一个void指针x,它指向数组'arr'的内存地址,并将整数23放入该内存地址.但是当我编译它时,我收到错误消息"'void*'不是指向对象的指针类型".当我使用'int'指针而不是void指针然后编译它时,我没有得到任何错误或警告.我想知道为什么我会收到这个错误.
谢谢.
所以我有以下两种结构.假设我有一个无效指针,根据情况,指向包或苹果.如何检查它指向哪种结构类型,以便我可以取消引用它?
struct product
{
int price;
string name;
};
struct fruit : product
{
int weight;
};
product bag;
fruit apple;
Run Code Online (Sandbox Code Playgroud)
编辑:所以这只是我在新工作中使用的代码的简化版本.我需要检查一个特定的变量,但是像水果中的权重变量一样,有时它会被一个空指针传递,有时它不是.已经有很多代码,所以从void指针改变它会太多了.我需要检查权重变量是否存在,然后根据其中的值做一些事情.
我有以下代码(住在Coliru):
// untouchable extern library .hpp file
typedef union ExternLibraryUnion
{
int a;
float b;
}ExternLibraryUnion;
// my code
#include <iostream>
class Container{
public:
Container() : m_union(NULL) {};
~Container(){
if(m_union){
delete m_union;
}
}
void init(){
m_union = new ExternLibraryUnion();
}
ExternLibraryUnion* get_union(){
return m_union;
}
private:
ExternLibraryUnion* m_union;
};
class Master{
public:
Master() : m_union(NULL) {
m_container.init();
};
~Master(){
if(m_union){
delete static_cast<ExternLibraryUnion*>(m_union);
}
}
void load(){
}
void set(int i){
m_union = m_container.get_union();
m_union->a = i;
} …Run Code Online (Sandbox Code Playgroud) void-pointers ×10
c++ ×6
c ×4
pointers ×4
casting ×2
codeblocks ×1
embedded ×1
struct ×1
unions ×1
void ×1