我正在查看用C++编写的API,我对以下参数类型的含义感到困惑:
void*& data
这是否意味着用户会传入对void指针的引用?如果这是真的,有什么意义呢?我的意思是void*已经是间接的,那你为什么要再次重定向呢?
嘿伙计们,我是C的新手,对于我的第一个项目,我需要实现一个基于数组的队列.我希望我的队列能够保存任何类型的对象,因此我创建了一个QueueElement结构来保存指向任何类型对象的void指针.我认为一切正常,除了我无法从QueueElement结构中读取'position'和'value'字段.我尝试编译时遇到以下错误.
错误:
Runnable.c: In function `main':
Runnable.c:10: error: dereferencing pointer to incomplete type
Runnable.c:11: error: dereferencing pointer to incomplete type
Run Code Online (Sandbox Code Playgroud)
我很确定我只是没有正确投射.任何帮助表示赞赏.
再次感谢,Pooch
Runnable.c
#include <stdio.h>
#include "Queue.h"
int main(void) {
int i = 9;
Queue q = CreateQueue();
QueueElement e = CreateQueueElement(&i);
Enqueue(q, e);
QueueElement f = Dequeue(q);
/* PROBLEM IS HERE */
printf("position: %d", f->position);
printf("value: %d", (int *)(f->value));
DestroyQueue(q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include "QueueElement.h"
typedef struct QueueStruct *Queue;
Queue CreateQueue(void);
void DestroyQueue(Queue q); …Run Code Online (Sandbox Code Playgroud) 我的搜索foo今天似乎缺乏.
我想知道根据标准C++ 是否合法通过(unsigned(?))char*检查"任何"内存位置.通过任何位置我的意思是任何有效的程序内的对象或阵列(或阵列的内部)的地址.
举例来说:
void passAnyObjectOrArrayOrSomethingElseValid(void* pObj) {
unsigned char* pMemory = static_cast<unsigned char*>(pObj)
MyTypeIdentifyier x = tryToFigureOutWhatThisIs(pMemory);
}
Run Code Online (Sandbox Code Playgroud)
免责声明:这个问题纯粹是学术性的.我不打算把它放到生产代码中!通过法律我的意思是,如果它是真正的法律依据的标准,那就是是否会在所有的实现100%的工作.(不仅仅是在x86或一些常见的硬件上.)
子问题:是否是static_cast从void*地址到char*指针的正确工具?
这与在此找到的问题标题完全相同- 我还想将一个内存地址存储在变量中 - 或者更确切地说,void*在变量中存储一个.但是,我宁愿将它存储在某种形式的int而不是a中string,因为我希望之后再将其转换回指针.
这是因为它是一个类的成员,我想用boost serialize序列化,如果我确实使用了一个void*,boost serialize可能会尝试存储指针所指向的内容,这在我看来不是很明智案件.
我需要32位和64位gcc和MSVC,所以基本上我想知道是否有一个内置的整数类型,它是同一平台上指针的大小.或者,我想我需要IFDEF自己的类型?
我将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)
我知道这是不够的,因为我得到了"从不兼容的指针类型初始化"警告.在这种情况下,如何成功投出空白*?谢谢.
所以我有一个MainController,
在标题内我void*声明了这个:
static void *kStrokeColorWellChangedContext = &kStrokeColorWellChangedContext;
Run Code Online (Sandbox Code Playgroud)
在实现内部,我正在处理观察:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void*)context
{
if( [keyPath isEqualToString:@"color"] )
{
if( context == kStrokeColorWellChangedContext )
{
[self setValue:[change objectForKey:@"new"] forKey:@"strokeColor"];
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个具有此行的ViewController,它将MainController作为观察者添加到视图中
[self.strokeColorWell addObserver:self.toolController forKeyPath:@"color" options:NSKeyValueObservingOptionNew context:kStrokeColorWellChangedContext];
Run Code Online (Sandbox Code Playgroud)
因此,当视图的颜色发生变化时,它会通知MainController,并-observeValueForKey:使用键输入例程@"color"
但它无法进入if我正在检查的内部区块context.
如果我要换掉我void*的NSString*代替,它就像我期望的那样工作.
怎么可能void*看起来有两个不同的地址存储在其中?
编辑:
也许这些价值void*可能有所帮助
结果po kStrokeColorWellChangedContext:
0x00000001005553e8
结果po context在-observeValueForKey:: …
我收到以下警告:
incompatible pointer types 'void**' and 'int* [2]'.
当我尝试编译以下代码时:
#include <stdlib.h>
void func1(void *arr[]) { }
int main() {
int *arr[2];
for (int i = 0; i < 5; i++) {
arr[i] = (int*)malloc(sizeof(int));
*(arr[i]) = 5;
}
func1(arr);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我施放arr时它起作用,我(void**)找不到原因.此外我发现我还需要使用以下代码:
#include <stdlib.h>
void func1(void **arr) { }
int main() {
int **arr;
int i[] = { 1, 2 };
int j[] = { 3, 4 };
*arr = i;
*(arr+1) = j;
func1(arr); //Doesn't compile unless …Run Code Online (Sandbox Code Playgroud) 我想编写一个可以释放尽可能多的指针的函数.所以我有这个:
void myfree(size_t n, ...)
{
void **del;
va_list ap;
va_start(ap, n);
while (n > 0)
{
del = va_arg(ap, void **);
free(*del);
*del = NULL;
--n;
}
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
char *one = malloc(x);
sometype_t *two = malloc(x);
myfree(2, &one, &two);
Run Code Online (Sandbox Code Playgroud)
我假设one并且two现在指向NULL.它似乎有效,但我仍然有点担心.我做了一些研究,void**但我不确定我的功能是否真的有效(UB你在那里吗?)
在我的研究和测试中,我尝试了一些我不太懂的东西.
假设我们有这个功能
void f(void **ptr)
{
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它
int *intptr = NULL;
f(&intptr);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告: warning: incompatible pointer types passing 'int **' to parameter of type 'void **'
所以我尝试了这个
int *intptr = …Run Code Online (Sandbox Code Playgroud) void-pointers ×10
c ×5
c++ ×4
pointers ×4
32bit-64bit ×1
arrays ×1
boinc ×1
casting ×1
objective-c ×1
string ×1
struct ×1
void ×1