我得到了这个问题无效的转换: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