标签: void-pointers

除了与内存分配相关的东西之外,还是必须的

void*从内存分配相关的东西除了必要的C++?能给我举个例子?

c++ void-pointers

5
推荐指数
1
解决办法
279
查看次数

使用void指针指向数组

我只是试图使用一个指向整数数组的void指针,我试着看看我是否可以通过将数组转换回int来打印它.但它给了我一些随机价值.你能告诉我哪里出错了吗?

#include<stdio.h>
#include<stdlib.h>

int main(){
    int a[5];
    int x;
    int j;

    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;

    void *arr=a;

    for(j=0;j<4;j++){
        x = *(int *)(arr+j);
        printf("%d",x);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

133554432131072512
Run Code Online (Sandbox Code Playgroud)

为什么它没有固定数组的元素a []即1,2,3,4?

c pointers void-pointers pointer-arithmetic

5
推荐指数
2
解决办法
2万
查看次数

从void*转换为struct

我将struct Person类型的数据传递给链表,因此每个节点的数据指针指向一个结构Person.

struct Person {
char name[16];
char text[24];
};
Run Code Online (Sandbox Code Playgroud)

我试图遍历列表并通过调用打印每个节点中的名称/文本

traverse(&list, &print);
Run Code Online (Sandbox Code Playgroud)

遍历的原型是:

void traverseList(struct List *list, void (*f)(void *));   
Run Code Online (Sandbox Code Playgroud)

列表定义为:

struct List {
struct Node *head;
};
Run Code Online (Sandbox Code Playgroud)

我的print函数接受void*数据:

print(void *data) { .... }
Run Code Online (Sandbox Code Playgroud)

我知道我必须将数据转换为struct Person,对吗?

struct Person *person = (struct Person *)data;
printf("%s", person->name);
Run Code Online (Sandbox Code Playgroud)

我知道这是不够的,因为我得到了"从不兼容的指针类型初始化"警告.在这种情况下,如何成功投出空白*?谢谢.

c struct void-pointers

5
推荐指数
1
解决办法
1万
查看次数

在C中将void void指针转换为uint64_t数组

我目前正在使用Linux内核模块,我需要访问存储在数组中的一些64位值,但是我首先需要从void指针进行转换.

我正在使用phys_to_virt返回void指针的内核函数,我不完全确定如何实际使用此void指针来访问它指向的数组中的元素.

目前我这样做:

void *ptr;
uint64_t test;

ptr = phys_to_virt(physAddr);
test = *(uint64_t*)ptr;
printk("Test: %llx\n", test);
Run Code Online (Sandbox Code Playgroud)

我从测试中获得的值不是我期望在数组中看到的值,所以我很确定我做错了什么.我需要访问数组中的前三个元素,所以我需要将void指针强制转换为uint64_t [],但我不太清楚如何做到这一点.

任何建议将不胜感激.

谢谢

c memory pointers void-pointers dereference

5
推荐指数
1
解决办法
3143
查看次数

对C中的指针和泛型(void)指针感到困惑

我错过了几个课程,并没有真正理解流动的演讲幻灯片关于void指针的例子.

  1. 在"no,no,no"这一行中,为什么我们不能因为P被分配了一个真正的指针类型q而不需要P?

  2. 在"??"行中,将指针强制转换为整数是否合法?(我认为它可以编译,因为C不会检查强制转换,但不知道它将获得什么样的结果

在这个例子中 ,整数指针转换为
他铸造的整数*p = 10; a =(int)p; 并且有人回答说a将是一个非常大的价值.但在我的情况下,是(int)*p ...是否与我上面给出的例子相同?

  1. 在最后一行,我对表达式感到困惑.*((int*)p)实际上是= p吗?谢谢!

在此输入图像描述

在此输入图像描述

c pointers generic-programming void-pointers

5
推荐指数
1
解决办法
307
查看次数

C++与C中函数调用中的void指针

我有这段代码在C而不是C++中工作,是否可以使它在C和C++上工作?

void foo(void* b)
{
   int *c = b;
   printf("%d\n",*c); 

}

int main ()
{
 int a = 1000;

 foo(&a);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

C++:

1 In function 'void foo(void*)':
2 Line 3: error: invalid conversion from 'void*' to 'int*'
3 compilation terminated due to -Wfatal-errors.
Run Code Online (Sandbox Code Playgroud)

C:

1000
Run Code Online (Sandbox Code Playgroud)

请帮忙

c c++ void-pointers

5
推荐指数
1
解决办法
1142
查看次数

如何在 IDL 中声明 void* 类型的参数

我正在开发 ATL 项目。一些接口包含传递各种指针的参数。这是我的 IDL 文件:

import "oaidl.idl";
import "ocidl.idl";
[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make")] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize")] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
[
    uuid(E57065B4-498F-4347-9ACC-A2C86A771720),
    version(1.0),
    helpstring("TestComVoid 1.0 Type Library")
]
library TestComVoidLib
{
    importlib("stdole2.tlb");
    [
        uuid(1DC2528B-EA49-4F89-BB56-B1D667379644),
        helpstring("MyObject Class")
    ]
    coclass MyObject
    {
        [default] interface IMyObject;
    };
};
Run Code Online (Sandbox Code Playgroud)

IMyObject 的第一种方法根据类型和对应的结构构造一个对象。第二种方法基于二进制数据构造一个对象。

但我收到错误 MIDL2139:参数的类型不能从 void 或 void * 派生

另外,我想制作一个带有 IntPtr 参数的 C# 包装器来传递指针。(“添加引用”->COM->“TestComVoid 1.0 类型库”) …

com idl atl void-pointers

4
推荐指数
1
解决办法
3822
查看次数

如何获取 void 指针数据的副本

我尝试自己实现链表。因此,当我向其中添加新数据时,我会使用类似node->data = datawhere的内容data is (void*) type。所以我想通过意外编辑添加的变量来防止数据损坏。

例如:

int data = 10;
LinkedList_add(list, (void*)&data);
...
/* It will modify value in list */
data = new value; 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我尝试这样复制它:

 void* data_copy;
 *data_copy = *_data;
Run Code Online (Sandbox Code Playgroud)

但我觉得这行不通,也行不通。

c pointers copy void void-pointers

4
推荐指数
1
解决办法
9819
查看次数

Auto和Void之间的区别?

我正在阅读C++ Primer Book(第五版),我对正在阅读的书有疑问.它说:

该类型void*是一种特殊的指针类型,可以保存任何对象的地址.与任何其他指针一样,void*指针保存地址,但该地址处对象的类型未知.

好的,所以我理解但是...我对这个陈述有很多矛盾.首先,你不能用auto吗?它不是一样的void吗?意思不是

void *somePtr;
Run Code Online (Sandbox Code Playgroud)

auto *somePtr;
Run Code Online (Sandbox Code Playgroud)

相同?

其次,它说附加地址的类型是未知的.你不能typeid用来获得这种类型吗?像这样:

int a = 5;
auto *somePtr = 5;
std::cout << typeid(*somePtr).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

c++ pointers void-pointers c++11

4
推荐指数
2
解决办法
3030
查看次数

将 void* 转换为 std::function

我有一个问题。我正在尝试将 void* 转换为 std::function 。这只是一个简单的例子,任何建议将不胜感激

#.h file
class Example {

public:

  Example();
  int foo(void* hi);

  int fooFunc(std::function<int(int, int)> const& arg, int x, int y) {
    foo(arg.target<void*>(), x, y);
    return 2;
  }

};


#.cpp file
Example::Example() {

  }

  int Example::foo(void * func, int x, int y)
  {
    //cast back to std::function
    func(x, y);
    std::cout << "running in foo: " << a << "\n";
    return a;
  }
Run Code Online (Sandbox Code Playgroud)

我尝试的每一次选角都不起作用。

我知道我可以在这个例子中发送一个std::function,但这是为了更大的事情,我正在研究一个例子以使其在这里工作。

,的全部含义void*是有时在这些情况下使用它,当您不知道您将收到什么时,然后将其转换为您需要的特定用法。

谢谢!

casting void-pointers c++11 std-function

4
推荐指数
1
解决办法
5634
查看次数