2013-05-16 114 views
0

我在C++編程方面很缺乏經驗,現在我正在嘗試使用dctmk來修改dicom圖像的像素數據。在閱讀文檔時,我發現了一個我不太清楚的C++方法。在機制的文檔的類DicomImage我發現下面的方法:與void *類型內存分配混淆?

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

我的困惑是關於buffer。它在鏈接的

緩衝報價:指向內存緩衝區(必須已分配)

這裏我的困惑是如何做一個我分配?我不知道如何分配一個空的類型的指針的內存。你能解釋一下嗎?謝謝。

+1

請不要忘記選擇其中一個答案,如果它解決了你的問題。這將有助於更多讀者快速找到解決問題的方法。 – Spook

回答

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); 
+0

看起來像char [1024]是一個c#功能 – spiritwolfform

+0

是。最近C#太多了。現在應該是正確的。 – Spook

+0

在這種情況下是否需要刪除mem? char mem [1024]; –

4

指向void的指針可指向任何內容,它是指向某個內存的通用匿名匿名指針。這意味着您可以傳遞任何類型的指針作爲函數的第一個參數,因爲所有指針都可以隱式轉換爲void*

+0

現在我正在執行以下操作: 'void * buffer; buffer =(void *)malloc(sizeofdata);' 那好嗎? –

+2

是的,你不必將malloc的結果轉換爲void *,因爲malloc AFAIR已經返回void * – Spook

+1

@the_naive - 雖然'malloc'沒問題,但它僅僅適用於C兼容。C++相當於'new char [sizeofdata]' - 分配一個字符數組(有效字節)。當你釋放時,對'malloc'使用'mfree'或對'new'使用'mfree',或者對'new'使用''delete'''你必須使用delete []'釋放數組,以釋放單個值)。 – Steve314

0

您可以分配任何類型的緩衝區。它將使用void *進行轉換。但是,您需要傳遞適當大小的元素。您需要參考api的文檔以瞭解每個緩衝區元素的大小。在下面的例子中它是1個字節。而總的緩衝區大小爲10

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

您必須將malloc的結果轉換爲無符號字符*,因爲AFAIR malloc返回純void *。 – Spook

+1

我會避免使用'malloc',除非它需要與基於C的API兼容。優先使用'new'和'delete'並避免投射和大小計算。 'uint8_t * buffer = new uint8_t [size_of_buffer];'更短,更直觀,更易於維護。 –

0

它看起來像DicomImage::getOutputData不關心你如何分配你的字節。只需將指針指向您選擇的某個對象(對象,結構體,數組,任何)並將其轉換爲void*即可。您可以使用newmalloc獲得內存,也可以是局部變量。

一點可以肯定的:

  • 確保分配足夠的空間。
  • 確保您準確發送size參數。
  • 請確保您瞭解DicomImage::getOutputData適用的數據格式。