我得到了這個問題無效的轉換:C++:的malloc:錯誤:從 '無效*' 到 'uint8_t *'
invalid conversion from ‘void*’ to ‘uint8_t*’
做這件事時:
int numBytes;
uint8_t *buffer;
buffer=malloc(numBytes); //error here, why?
或我必須把它是這樣嗎?
buffer=malloc(numBytes);
請解釋一下。
我得到了這個問題無效的轉換:C++:的malloc:錯誤:從 '無效*' 到 'uint8_t *'
invalid conversion from ‘void*’ to ‘uint8_t*’
做這件事時:
int numBytes;
uint8_t *buffer;
buffer=malloc(numBytes); //error here, why?
或我必須把它是這樣嗎?
buffer=malloc(numBytes);
請解釋一下。
您不能在C++中隱式地從void *
強制轉換(不像C在這方面)。你可以這樣做:
buffer = static_cast<uint8_t *>(malloc(numBytes));
不過說真的,你應該只使用new
/delete
,而不是malloc
/free
!
你可以從'void *'調用'static_cast',如果只是因爲'reinterpret_cast'會導致人們不必要地恐慌,可能應該這樣做。 – 2010-10-24 23:08:42
這不是reinterpret_cast <>的情況,你應該爲非常特殊的情況保留你想要人們重新檢查代碼(尤其是移植時)的情況。 – 2010-10-24 23:33:54
@Martin,@Steve:你是對的,回答更新... – 2010-10-25 07:29:24
Malloc返回一個void指針;當你使用它時,你必須將返回值轉換爲指向你存儲在其中的任何數據類型的指針。
buffer = (uint8_t *) malloc(numBytes);
只限於C++。如果你使用C++,你不應該使用C風格的轉換或malloc。 – 2010-10-25 00:08:21
在C++不允許簡單地將一種類型的指針指定給其他類型的指針(總是有例外,它是例如有效的任何指針分配給空隙。指針)
你應該做的是你的空指針轉換爲一個uint8_t指針:
buffer = (uint8_t *) malloc (numBytes);
注意:這是隻需要在C++中,在C它允許混合和匹配指針。大多數C編譯器會發出警告,但它是有效的代碼。
由於您使用C++,你也可以使用new和delete是這樣的:
buffer = new uint8_t[numBytes];
和使用擺脫你的緩衝區:
delete[] buffer;
一般來說,你不應該使用malloc並免費,除非你必須與C庫接口。
「一般來說,除非必須使用,否則不應該使用malloc和free。」除非必須使用新的[]和刪除[]。幾乎所有的時間'vector'都能很好地工作。 – 2010-10-24 23:11:23
而且你不應該在C++中使用c風格轉換。 – 2010-10-25 00:07:58
請使用某種智能指針。 – GManNickG 2010-10-25 07:33:51