标签: void-pointers

参数类型void*&mean是什么以及它的用途是什么?

我正在查看用C++编写的API,我对以下参数类型的含义感到困惑:

void*& data

这是否意味着用户会传入对void指针的引用?如果这是真的,有什么意义呢?我的意思是void*已经是间接的,那你为什么要再次重定向呢?

c++ pass-by-reference void-pointers boinc

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

C Dereference 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)

c pointers void void-pointers

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

我可以通过C++中的(unsigned)char*读取任何可读的有效内存位置吗?

我的搜索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*指针的正确工具?

c++ string pointers memory-access void-pointers

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

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

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

c++ void-pointers

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

如何以整数存储内存地址?

这与在找到的问题标题完全相同- 我还想将一个内存地址存储在变量中 - 或者更确切地说,void*在变量中存储一个.但是,我宁愿将它存储在某种形式的int而不是a中string,因为我希望之后再将其转换回指针.

这是因为它是一个类的成员,我想用boost serialize序列化,如果我确实使用了一个void*,boost serialize可能会尝试存储指针所指向的内容,这在我看来不是很明智案件.

我需要32位和64位gcc和MSVC,所以基本上我想知道是否有一个内置的整数类型,它是同一平台上指针的大小.或者,我想我需要IFDEF自己的类型?

c++ void-pointers 32bit-64bit

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

从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万
查看次数

观察对具有KVO的对象的更改,上下文指针似乎不使用void*,但适用于NSString*

所以我有一个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:: …

objective-c key-value-observing void-pointers

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

对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
查看次数

void**指针和void*[]作为函数参数

我收到以下警告: 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)

c arrays pointers casting void-pointers

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

使用void*,void**和可变参数函数

我想编写一个可以释放尽可能多的指针的函数.所以我有这个:

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)

c variadic-functions void-pointers

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