与void *类型内存分配混淆?

时间:2013-05-16 09:28:14

标签: c++

我对C ++编程缺乏经验,现在我正在尝试用dctmk制作一个小程序来修改dicom图像的像素数据。在阅读文档的过程中,我发现了一个c ++方法,我不太清楚。在课程DicomImage的文档中,我找到了以下方法:

int DicomImage::getOutputData   (   void *      buffer,
        const unsigned long     size,
        const int   bits = 0,
        const unsigned long     frame = 0,
        const int   planar = 0   
    )

我的困惑是buffer。它在链接中引用为

  

buffer:指向内存缓冲区的指针(必须已经分配)

这里我的困惑是我如何分配?我不确定如何分配一个void类型指针的内存。你能解释一下吗?谢谢。

4 个答案:

答案 0 :(得分:5)

您可以通过以下方式执行此操作(例如):

void * mem = malloc(1024); // 1 kb

image.GetOutputData(mem, 1024);

// Don't forget to free(mem);

另一种方式:

char * mem = new char[1024];

image.GetOutputData((void *)mem, 1024);

// Don't forget to delete[] mem;

另一种方式:

char mem[1024];

image.GetOutputData((void *)&mem, 1024);

答案 1 :(得分:4)

指向void的指针可以指向任何内容,它是指向某些内存的通用非描述性匿名指针。这意味着您可以将任何类型的指针作为函数的第一个参数传递,因为所有指针都可以隐式转换为void*

答案 2 :(得分:0)

您可以分配任何类型的缓冲区。它将使用void *进行转换。但是,您需要传递适当大小的元素。您需要参考api的文档,了解每个缓冲区元素的大小。在下面的示例中,它是1个字节。总缓冲区大小为10。

int size_of_buffer = 10;
unsigned char *buffer = malloc(sizeof(unsigned char)*size_of_buffer);

答案 3 :(得分:0)

看起来DicomImage::getOutputData并不关心你如何分配你的字节。只需将指针指向您选择的某个blob(对象,结构,数组等),然后将其转换为void*。您可以使用newmalloc获取内存,也可以将其作为本地变量。

可以肯定:

  • 确保分配足够的空间。
  • 确保准确发送size参数。
  • 确保您了解DicomImage::getOutputData使用的数据格式。