下面的代码有一个错误,请帮助我如何解决它。我是C++初学者。
int main(int argc, char **argv)
{
image=malloc(3*1450*900*sizeof(char)); /* to ALLOCATE MEMORY required to SAVE the file */
some thing else....}
错误是:无法将类型为"void*"的值分配给类型为"char*"的实体
首先,在C++中,您应该使用 new / new[]
和 delete / delete[]
而不是 malloc()
。
更好的方法是使用 std::vector
: std::vector<char> image(3*1450*900);
如果你真的需要在C++中使用malloc()
,你需要强制转换返回值(malloc()
返回一个void*
):
image = (char*)malloc(3*1450*900*sizeof(char));
当然,在继续之前,请始终检查返回值。
为什么它不起作用和快速修复
代码不起作用的原因是,malloc()
返回一个无法隐式转换为char*
的void*
。因此,据说malloc()
不是类型安全的。您可以通过编写(char*)malloc(3*1450*900)
来显式转换返回的指针,但这有点丑陋。(顺便说一句,sizeof(char)
始终为 1。
更现代的方法
在现代C++中,您应该使用容器(如 std::vector<T>
)进行内存分配。另外:尽量避免函数和类之外的全局变量。这是我要写的:
int main()
{
std::vector<char> image( 3*1450*900 ); // automatically fills with zeros.
}
这样做的好处是,内存管理是自动完成的。销毁image
对象时,将释放分配的内存。
由于您使用的是C++,因此您应该使用 new[]
创建数组并使用 delete[]
删除它们。
int main(int argc, char **argv)
{
image = new char[3 * 1450 * 900];
// ... some code here? ...
// When you're finished with image:
delete[] image;
// ... some code here? ...
return 0;
}
如果您使用的是new[]
或new
运算符,则不需要sizeof
,但即便如此,我想提一下sizeof(char)
始终等于 1。
如果您使用的是 C++11(您应该使用!),那么将图像声明为unique_ptr<char[]>
可能更合适,以防止由于异常处理不当或只是忘记delete[]
而导致内存泄漏。
您在错误报告中看到的那样很清楚!您应该将"="运算符另一侧的所有内容都转换为 (char*)!
image=(char*)malloc(3*1450*900*sizeof(char));