下面的代码有错误,请帮我解决这个问题。我是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 *”类型的实体
答案 0 :(得分:5)
首先,在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));
当然,在继续之前总是检查返回值。
答案 1 :(得分:4)
您的代码无效的原因是,malloc()
返回void*
,无法隐式转换为char*
。因此,据说malloc()
不是类型安全的。您可以通过编写(char*)malloc(3*1450*900)
显式地转换返回的指针,但这有点难看。 (BTW sizeof(char)
始终为1.)
在现代C ++中,您应该使用std::vector<T>
之类的容器进行内存分配。另外:尽量避免函数和类之外的全局变量。这就是我要写的内容:
int main()
{
std::vector<char> image( 3*1450*900 ); // automatically fills with zeros.
}
这样做的好处是,内存管理是自动完成的。当image
对象被销毁时,将释放分配的内存。
答案 2 :(得分:2)
由于您使用的是C ++,因此您应该使用GetItemList
创建数组,并使用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;
}
或sizeof
运营商,则不需要new[]
,但即便如此,我还要提及new
总是等于1。
如果您正在使用C ++ 11(您应该是!),那么将图像声明为sizeof(char)
可能更合适,以防止由于不正确的异常处理或仅仅忘记{{1}而导致的内存泄漏}}
答案 3 :(得分:1)
图像=(字符*)malloc的(3 * 1450 * 900 *的sizeof(char)的);