标签: void-pointers

指向C++中的void?

我正在阅读Ogre3D实现中的一些代码,我无法理解void *类型变量的含义.指针void在C++中意味着什么?

c++ pointers void void-pointers

11
推荐指数
1
解决办法
8026
查看次数

替换realloc(C - > C++)

在之前的一个问题中,我询问了类型转换指针,但是针对使用C++分配系统而不是mallocs的更好解决方案.(我正在将一些C代码转换为C++)

但是,我仍然遇到类似功能的问题:

我变了:

tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp];
Run Code Online (Sandbox Code Playgroud)

free(tmp) --> delete [] tmp;
Run Code Online (Sandbox Code Playgroud)

但是,我在以下函数中如何处理realloc:

char* space_getRndPlanet (void)
{
   int i,j;
   char **tmp;
   int ntmp;
   int mtmp;
   char *res;

   ntmp = 0;
   mtmp = CHUNK_SIZE;
   //tmp = malloc(sizeof(char*) * mtmp); <-- replaced with line below
   tmp = new char*[mtmp];
   for (i=0; i<systems_nstack; i++)
      for (j=0; j<systems_stack[i].nplanets; j++) {
         if(systems_stack[i].planets[j]->real == ASSET_REAL) {
            ntmp++;
            if (ntmp > mtmp) { /* need more space */
               mtmp += …
Run Code Online (Sandbox Code Playgroud)

c c++ void-pointers realloc

11
推荐指数
3
解决办法
9703
查看次数

C:为什么从void指针转换为函数指针未定义?

可能重复:
为什么函数指针和数据指针在C/C++中不兼容?

在dlsym的手册页中,提供了以下代码段.

       double (*cosine)(double);

       handle = dlopen("libm.so", RTLD_LAZY);
       /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
          would seem more natural, but the C99 standard leaves    
          casting from "void *" to a function pointer undefined.  
          The assignment used below is the POSIX.1-2003 (Technical
          Corrigendum 1) workaround; see the Rationale for the    
          POSIX specification of dlsym(). */

       *(void **) (&cosine) = dlsym(handle, "cos");
Run Code Online (Sandbox Code Playgroud)

我查看了相关的spec页面,但仍然无法理解不允许从void指针转换为函数指针的原因.虚假指针应该足够大,以容纳所有类型的指针.如果是这样,为什么不定义这个铸件呢?

c function-pointers void-pointers

11
推荐指数
0
解决办法
1655
查看次数

取消引用void指针

在更好地了解所给出的答案,希望这个帖子,可以有人请向我解释,如果下面的循环缓冲区的实现是可能的,如果没有,为什么没有.

#define CB_TYPE_CHAR     0
#define CB_TYPE_FLOAT    1

...

typedef struct CBUFF
{
    uint16 total;       /* Total number of array elements */
    uint16 size;        /* Size of each array element */
    uint16 type;        /* Array element type */
    uint16 used;        /* Number of array elements in use */
    uint16 start;       /* Array index of first unread element */
    void *elements;     /* Pointer to array of elements */
} CBUFF;

...

void cbRead(CBUFF *buffer, void *element)
{
    if (buffer->type == …
Run Code Online (Sandbox Code Playgroud)

c arrays void-pointers dereference

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

为什么删除void*是UB而不是编译错误?

为什么通过void*未定义的行为而不是编译错误来删除对象?

void foo(void* p) {
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译并生成代码,虽然gcc和clang上有警告(令人惊讶的是,ICC没有发出警告):

:2:5:警告:无法删除带有指针''''''的类型'void*'[-Wdelete-incomplete]

为什么不是简单的格式错误的程序,语法无效?貌似标准没有花太多时间就可以了,在说[expr.delete]

这意味着无法使用void*类型的指针删除对象,因为void不是对象类型.

我有什么理由不知道为什么这不会触发硬编译错误?

c++ void-pointers undefined-behavior language-lawyer delete-operator

10
推荐指数
1
解决办法
578
查看次数

找出C++ Void Pointer的类型

我有一个小问题:如何找出C++指针的类型?

我经常在我的控制台程序中使用一个小函数来收集输入,看起来像这样:

void query(string what-to-ask, [insert datatype here] * input)
Run Code Online (Sandbox Code Playgroud)

我想创建一个泛型表单,使用void指针,但我不能cin一个void指针,所以如何找出它的类型,所以我可以投射它?

c++ casting void-pointers

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

在observeValueForKeyPath中无法识别ios swift CMutableVoidPointer

我试图在我的Swift类中使用NSObject(NSKeyValueObserving),但我遇到了类型问题.Xcode抱怨它不理解以下代码中'context'参数的CMutableVoidPointer类型:

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer)
Run Code Online (Sandbox Code Playgroud)

我使用CMutableVoidPointer,因为Objective-C定义将'context'参数键入为void*.

我在编译时遇到的确切错误是:"使用未声明的类型'CMutableVoidPointer'".

我正在使用Xcode Beta 3.

任何帮助,将不胜感激.

objective-c void-pointers ios swift

9
推荐指数
1
解决办法
1696
查看次数

在Julia中声明C void指针的正确方法

好吧,我最初严重搞砸了我对这个问题的描述(自从我认真编写C++代码以来我已经超过一年了,我对纯C的经验非常有限),让我们再试一次.

编写一些C代码以期望您执行以下操作

void* p;
create_new_thing(&p);  //p is now a new thing
do_stuff_to_thing(p);  //something happened to p
Run Code Online (Sandbox Code Playgroud)

我的问题是如何p在Julia中创建对象.现在我相信答案

p = Ref{Ptr{Void}}()
ccall((:create_new_thing, :lib), Void, (Ptr{Ptr{Void}},), p)
ccall((:do_stuff_to_thing, :lib), Void, (Ptr{Void},), p)
Run Code Online (Sandbox Code Playgroud)

此外,我相信相同的代码,但p声明相反p = Array(Ptr{Void}, 1)也有效.

然而,我发现整个之间的区别Ref,并Ptr在朱莉娅非常混乱,主要是因为他们似乎的方式,我不能跟踪相互之间进行转换得到.

c void-pointers julia

9
推荐指数
1
解决办法
610
查看次数

临时为算术运算void*的正确方法是什么?

我是C新手,但多年来一直是程序员,所以我试图从2008年开始沿着斯坦福大学的课程学习C,并在C.中的向量上做作业3.

它基本上只是一个通用数组,所以数据作为一个结构保存在一个结构中void *.编译器标志-Wpointer-arith打开,所以我不能算术(我明白原因).

数据周围的结构必须不知道数据的类型,因此它对调用者来说是通用的.

为简化起见,我正在尝试以下代码:

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

typedef struct {
    void *data;
    int aindex;
    int elemSize;
} trial;

void init(trial *vector, int elemSize)
{
    vector->aindex = 0;
    vector->elemSize = elemSize;
    vector->data = malloc(10 * elemSize);
}

void add(trial *vector, const void *elemAddr)
{
    if (vector->aindex != 0)
        vector->data = (char *)vector->data + vector->elemSize;

    vector->aindex++;
    memcpy(vector->data, elemAddr, sizeof(int));

}

int main()
{
    trial vector;
    init(&vector, sizeof(int));

    for …
Run Code Online (Sandbox Code Playgroud)

c valgrind void-pointers memcpy pointer-arithmetic

9
推荐指数
1
解决办法
451
查看次数

为什么当static_cast(ing)一个函数作废*时,编译器的行为会有所不同?

以下代码可在VSC ++ 2017中编译且没有任何错误,并且不会在gcc 7.3.0(error: invalid static_cast from type ‘int(int)’ to type ‘void*’ void* p = static_cast<void*>(func))中编译

#include <iostream>

int func(int x) { return 2 * x; }

int main() {

    void* p = static_cast<void*>(func);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers void-pointers static-cast

9
推荐指数
1
解决办法
337
查看次数