我有问题让这个工作,
class A {
public:
A(int n) {
a = n;
}
int getA() {
return a;
}
private:
int a;
};
int main(){
A* a[3];
A* b[3];
for (int i = 0; i < 3; ++i) {
a[i] = new A(i + 1);
}
void * pointer = a;
b = (A* [])pointer; // DOESNT WORK Apparently ISO C++ forbids casting to an array type ‘A* []’.
b = static_cast<A*[]>(pointer); // DOESN'T WORK invalid static_cast from type ‘void*’ to …Run Code Online (Sandbox Code Playgroud) 在下面的:
struct adt { void * A; };
int new_adt(const void * const A)
{
struct adt * r = malloc(sizeof(struct adt));
r->A = A;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
警告:赋值从指针目标类型中丢弃限定符
我知道我可以使用
memcpy(&(r->A), &A, sizeof(void *));
Run Code Online (Sandbox Code Playgroud)
解决它,但我必须问:有什么选择吗?
通过使用const void * const我假装说不会对输入进行任何更改.而且,现在我想到它,const void *就足够了,不是吗?(因为我无法更改指针以便它影响调用者)
感谢您抽出宝贵时间阅读.
我被告知句柄是一种"无效"指针.但究竟什么"无效指针"意味着什么,它的目的是什么.还有什么"somehandle = GetStdHandle(STD_INPUT_HANDLE);呢?
正如标题所说,我现在正在做一些带有C++指针的小黑客,但是有些东西在这里没有用到我得到的东西:
uintptr_t texture_pointer = (int)((void*) &texture);
Run Code Online (Sandbox Code Playgroud)
纹理是一个类; 这似乎工作得很好,因为我得到一个指针值,我已经保证我得到了相同的值到我的另一个函数,它应该得到对象; 这是失败的代码:
std::cout << "C++ BEFORE: " << texture_pointer << std::endl;
Texture texture = *(Texture*)((void*) texture_pointer);
std::cout << "C++ AFTER: " << (uintptr_t)((void*) &texture) << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出我除外; 是两个相同的数字,但我得到两个不同的数字,因此我认为必定有一个错误,但我似乎无法找到它.
示例输出:
C++ BEFORE: 2685236
C++ AFTER: 2684960
Run Code Online (Sandbox Code Playgroud) 在讨论流时,Horstmann的C++陷阱解决了一个有趣的问题.引用他:
使用转换
void*,而不是转换为int或bool实现产生真值的对象.与int或不同bool,void*除了==比较之外没有任何合法的操作.
作为一名程序员,如果void*我期待一个布尔值,我会感到困惑.Horstmann提供了一个使用a void*而不是a bool似乎合适的例子.总是可取的吗?
请考虑以下示例:
class MyContainer {
std::vector<void *> v;
public:
void Put(void *x) { v.push_back(x);}
void* Get(int index) { return v[index];}
};
void Work (MyContainer& c) {
// cast_to_type(c.Get(0));
}
int main() {
int x = 1;
double y = 2.0;
MyContainer c;
c.Put(&x);
c.Put(&y);
Work(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
假设函数Work对向量指针指向的对象一无所知.还假设继承不是一个选项,并且指向对象的类型可以是任意的(可以有无数种类型).
是否可以仅使用MyContainer::Get函数返回的void指针来推断类型?可以使用演员表,模板和typeid操作员的任意组合来完成吗?
例如,如果我想写一个"免费",可以使指针变为空白,我可以编写如下内容:
void myfree(void **data) {
free(*data);
*data = NULL;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试写这个时,我得到一个编译器警告(来自gcc 4.6.2)说:( warning: passing argument 1 of ‘myfree’ from incompatible pointer type [enabled by default] ... note: expected ‘void **’ but argument is of type ‘char **‘在这种情况下,我释放一个char数组).
似乎void*是特殊的套管,以避免这种警告,因为calloc,free等不触发这样的警告,但void**不(给定以上).唯一的解决方案是明确的演员,还是我误解了什么?
[我正在重新审视最近一个项目中的一些痛点,想知道如何更好地处理它们,所以我们正在考虑角落案件,因此今天的C问题.]
鉴于这void*是特殊的更新,我可以在其中使用void*和转换myfree,但这将是一个有点不负责任的解决方案,因为每个人和他们的狗将传递一个看起来像的东西的指针free,所以我需要某种编译器警告基于"间接程度",这是一个实用的解决方案.因此,通用"指针指针"的想法.
考虑以下C#函数:
void DoWork()
{
...
}
Run Code Online (Sandbox Code Playgroud)
C#文档说明:
当用作方法的返回类型时,void指定该方法不返回值.
这似乎是直截了当的,在大多数情况下,这适合作为公平的定义.
但是,对于许多较低级别的语言(即C),"void"具有略微不同的含义.具体来说,所有代码块都必须返回一些内容.因此,void是空指针的表示,它是"无"的表示.在这种情况下,您不需要return在代码中包含语句,因为任何不返回值的块语句都会自动返回空指针.
这是C#所做的,或者当一个void函数被调用时,它是否执行一段代码并返回,甚至没有包含值为void的指针?
我有一个分配,我需要读取和写入一个内存块(预分配),为此,我需要实现两个函数:
memory_read(base,offset,size);
memory_write(base,offset,size,buffer);
Run Code Online (Sandbox Code Playgroud)
到目前为止没问题,我成功实现了写作部分.问题在于memory_read.我需要它来返回一大块数据(可能是void*),然后我可以将它转换为我期待的任何数据并使用它.
仅作为一个例子.假设我已经为该内存编写了一个序列化结构.我想做这样的事情
void *variable;
variable = memory_read(pointer_to_where_it_is,offset,sizeof(some_structure);
(some_structure) variable // and use it for something
Run Code Online (Sandbox Code Playgroud)
这就是memory_read的作用
void *memory_read(void *base, int offset, int size){
void *buffer;
buffer = malloc(size);
memcpy(&buffer,base+offset,size);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
当然,由于缓冲区存在于函数堆栈中,我在返回时会丢失对它的引用.
有什么想法怎么做?我不允许老师修改函数参数,否则我会传递&variable作为参数.
谢谢!
我传递一个字符指针数组sqlite3_exec,它接受1个参数并将其显示为a void *,但后来我想将它作为回调函数中的字符指针数组来访问.
char *output_params[] = {"one", "two"};
result = sqlite3_exec(db, sql_statement, callback, output_params, &zErrMsg);
....
static int callback(void *param, int argc, char **argv, char **azColName) {
// How do I access my character array?
char *output_params[2] = (char **)param;
}
Run Code Online (Sandbox Code Playgroud)
我通过后如何访问它?