Bio*_*i3c 1 c c++ pointers char
好吧,我正在尝试将一些C代码集成到C++项目中,并遇到了一些问题.我将在这里详述第一个.
我一直遇到这个错误:
错误:无法在赋值中将'char*'转换为'char**'
这是违规代码(标记断点):
char** space_getFactionPlanet( int *nplanets, int *factions, int nfactions )
{
int i,j,k;
Planet* planet;
char **tmp;
int ntmp;
int mtmp;
ntmp = 0;
mtmp = CHUNK_SIZE;
tmp = malloc(sizeof(char*) * mtmp); <--- Breakpt
Run Code Online (Sandbox Code Playgroud)
malloc函数派生自C头.这是宣言:
_CRTIMP void* __cdecl __MINGW_NOTHROW malloc (size_t) __MINGW_ATTRIB_MALLOC;
Run Code Online (Sandbox Code Playgroud)
我正在使用代码块,设置为使用MinGW.上面的语法对我来说完全是陌生的.
我完全难过,因为这个代码在我接受它的C程序中工作正常.
有任何想法吗?
编辑1:
糟糕,刚刚意识到声明来自stdlib.h.
编辑2:
我试过了:
tmp = static_cast<char **>(malloc(sizeof(char*) * mtmp));
Run Code Online (Sandbox Code Playgroud)
正如所建议的那样,但我没有得到错误:从'char*'类型的static_cast无效到'char**'类型.
编辑3:
好吧,reinterpret_cast有效,但是替换mallocs的解决方案看起来更加简洁,所以我会接受它.
但是,函数末尾没有free(tmp).如果我没有输入删除tmp [],这是一个问题吗?
编辑4:我应该补充一点,函数返回tmp,所以删除tmp是必要的,还是这是自动的?
好的,我正在标记这个解决了.谢谢你的帮助.
指针类型转换C++并不是那么自由.你必须做这样的事情:
tmp = static_cast<char **>(malloc(sizeof(char *) * mtmp));
Run Code Online (Sandbox Code Playgroud)
如果您malloc()返回a,这将有效void*.但是,您收到的错误表明您malloc()被声明为返回a char*,在这种情况下您必须使用reinterpret_cast:
tmp = reinterpret_cast<char **>(malloc(sizeof(char *) * mtmp));
Run Code Online (Sandbox Code Playgroud)
这会将返回类型转换为malloc()适合赋值的类型tmp.您可以在Type Casting中阅读有关C++中不同类型的强制类型的更多信息.
请注意,如果此代码仍必须在C中编译,则可以使用C样式转换:
tmp = (char **)malloc(sizeof(char *) * mtmp);
Run Code Online (Sandbox Code Playgroud)