我只是试图使用一个指向整数数组的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?
我将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)
我知道这是不够的,因为我得到了"从不兼容的指针类型初始化"警告.在这种情况下,如何成功投出空白*?谢谢.
我目前正在使用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而不是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)
请帮忙
我正在开发 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 类型库”) …
我尝试自己实现链表。因此,当我向其中添加新数据时,我会使用类似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++ 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) 我有一个问题。我正在尝试将 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*是有时在这些情况下使用它,当您不知道您将收到什么时,然后将其转换为您需要的特定用法。
谢谢!
void-pointers ×10
c ×6
pointers ×5
c++ ×3
c++11 ×2
atl ×1
casting ×1
com ×1
copy ×1
dereference ×1
idl ×1
memory ×1
std-function ×1
struct ×1
void ×1