我使用的是ide-dev-cpp。当我尝试执行我的程序时
char *path;
path = malloc(10);
该代码返回一个错误:
34 20 E:\C:\dir.cpp[Error]从"void*"到"char*"的转换无效[-fpermission]
原因是什么?
如何为char数组动态分配内存?
您使用的是C++编译器,而不是问题的C标记所建议的C编译器。事实上,编译器名称和文件名支持您使用C++编译器的事实。
您的代码在C中有效,但在C++中无效。在C++中,您需要强制转换malloc
返回的值。关于C和C++之间的这种区别的详细讨论,请参阅Eli Bendersky的这篇文章:C和C++中的void*和casts。
但是,如果您正在编写C++,则通常会避免使用malloc
和原始指针,而使用std::string
。
或者,如果你正在编写C,那么你只需要用C编译器编译代码。
您最初将其标记为C,但源文件dir.cpp
的文件扩展名表明您正在尝试编写C++。如果您打算编写C++,那么您根本不应该使用malloc
。使用std::string
并使用new
分配内存。
如果由于某种原因必须使用C++编译器编译C,则必须显式地从malloc
强制转换返回的指针:
path = (char*) malloc (10);
。
然而,最好还是决定使用哪种语言。要么直接编写C++,要么使用C编译器编写C代码。试图使用C++编译器会导致这种性质的虚假警告,绕过这些警告会导致你的C代码变得非常丑陋和非C类,就像在本例中一样。
在dev-cpp 中更改用于代码的编译器
- 转到dev-cpp菜单->项目->项目选项->文件选项卡
- 使用代码选择文件
- 取消选中
Compile file as C++
开发cpp版本4.9.9.2。
malloc返回一个指向已分配内存的void指针。由于您使用C++编译器进行编译,在C++编译器中执行强类型检查,因此会引发错误。打字会解决你的问题。
path = (char * ) malloc (10);
将起作用。
此外,不要使用像10这样的数字,而是使用sizeof运算符,比如
path = (char *) malloc (10 * sizeof(char));