标签: void-pointers

从void*转换为c ++中的对象数组

我有问题让这个工作,

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)

c++ arrays casting void-pointers

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

在C中将const赋值给非const

在下面的:

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 *就足够了,不是吗?(因为我无法更改指针以便它影响调用者)

感谢您抽出宝贵时间阅读.

c const void-pointers

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

用c ++处理对象

我被告知句柄是一种"无效"指针.但究竟什么"无效指针"意味着什么,它的目的是什么.还有什么"somehandle = GetStdHandle(STD_INPUT_HANDLE);呢?

c++ winapi handle void-pointers

3
推荐指数
1
解决办法
2805
查看次数

C/C++指针技巧(将指针保存到int,并转换回来)

正如标题所说,我现在正在做一些带有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)

c++ pointers casting void-pointers

3
推荐指数
1
解决办法
5125
查看次数

使用void*而不是bool是一种可行的做法吗?

在讨论流时,Horstmann的C++陷阱解决了一个有趣的问题.引用他:

使用转换void*,而不是转换为intbool实现产生真值的对象.与int或不同bool,void*除了==比较之外没有任何合法的操作.

作为一名程序员,如果void*我期待一个布尔值,我会感到困惑.Horstmann提供了一个使用a void*而不是a bool似乎合适的例子.总是可取的吗?

c++ boolean void-pointers

3
推荐指数
1
解决办法
1292
查看次数

从void指针中推断出一个类型

请考虑以下示例:

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操作员的任意组合来完成吗?

c++ void-pointers

3
推荐指数
1
解决办法
3186
查看次数

C是否具有通用的"指针指针"类型?

例如,如果我想写一个"免费",可以使指针变为空白,我可以编写如下内容:

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 pointers void-pointers

3
推荐指数
1
解决办法
292
查看次数

什么都不返回或返回void - C#在void Function()调用结束时究竟做了什么?

考虑以下C#函数:

void DoWork()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

C#文档说明:

当用作方法的返回类型时,void指定该方法不返回值.

这似乎是直截了当的,在大多数情况下,这适合作为公平的定义.

但是,对于许多较低级别的语言(即C),"void"具有略微不同的含义.具体来说,所有代码块都必须返回一些内容.因此,void是空指针的表示,它是"无"的表示.在这种情况下,您不需要return在代码中包含语句,因为任何不返回值的块语句都会自动返回空指针.

这是C#所做的,或者当一个void函数被调用时,它是否执行一段代码并返回,甚至没有包含值为void的指针?

c# void void-pointers

3
推荐指数
1
解决办法
2375
查看次数

在C中读取内存块

我有一个分配,我需要读取和写入一个内存块(预分配),为此,我需要实现两个函数:

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作为参数.

谢谢!

c pointers void-pointers memcpy

3
推荐指数
1
解决办法
1866
查看次数

如何将一个字符指针数组作为void*传递,然后转换回字符指针数组?

我传递一个字符指针数组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)

我通过后如何访问它?

c arrays pointers void void-pointers

3
推荐指数
1
解决办法
2771
查看次数

标签 统计

void-pointers ×10

c++ ×5

c ×4

pointers ×4

arrays ×2

casting ×2

void ×2

boolean ×1

c# ×1

const ×1

handle ×1

memcpy ×1

winapi ×1