char*和char**的问题(C - > C++)

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是必要的,还是这是自动的?

好的,我正在标记这个解决了.谢谢你的帮助.

Gre*_*ill 5

指针类型转换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)