好的,我正在尝试将一些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
malloc函数派生自C头。这是宣言:
_CRTIMP void* __cdecl __MINGW_NOTHROW malloc (size_t) __MINGW_ATTRIB_MALLOC;
我正在使用代码块,设置为使用MinGW。上面的语法对我来说完全是陌生的。
我完全难过,因为这个代码在我从中获取的C程序中运行良好。
任何想法?
编辑1:
糟糕,刚刚意识到声明来自stdlib.h。
编辑2:
我试过了:
tmp = static_cast<char **>(malloc(sizeof(char*) * mtmp));
根据建议,但不是我收到错误:从'char *'类型的static_cast无效到'char **'类型。
编辑3:
好的,reinterpret_cast有效,但是替换mallocs的解决方案看起来更加简洁,所以我将继续这样做。
但是,函数末尾没有free(tmp)。如果我没有输入删除tmp []?
,这是一个问题吗?编辑4:我应该补充一点,函数返回tmp,所以删除tmp是必要的,还是这是自动的?
好的,我正在标记这个解决了。谢谢你的帮助。
答案 0 :(得分:5)
C ++并不是那么自由的指针类型转换。你必须做这样的事情:
tmp = static_cast<char **>(malloc(sizeof(char *) * mtmp));
如果您的malloc()
返回void*
,那将会有效。但是,您收到的错误表明您的malloc()
被宣布为返回char*
,在这种情况下,您必须使用reinterpret_cast
代替:
tmp = reinterpret_cast<char **>(malloc(sizeof(char *) * mtmp));
这会将malloc()
的返回类型转换为适合分配到tmp
的类型。您可以在Type Casting了解有关C ++中不同类型的强制类型的更多信息。
请注意,如果此代码仍必须在C中编译,则可以使用C样式转换:
tmp = (char **)malloc(sizeof(char *) * mtmp);
答案 1 :(得分:4)
如果您正在转换为C ++,那么让我们放弃使用malloc吗?
tmp = new char*[mtmp];
但是稍后你可能会发现这样的事情:
free(tmp);
您需要更改为:
delete [] tmp;
如果从函数返回tmp,请不要删除它。您需要跟踪指针。在某个地方,也许在多个地方,将会被称为免费。如果您使用此解决方案,则需要将其替换为删除。但是,更好的解决方案是将所有指针放在一起,并用
替换它vector<string>
答案 2 :(得分:2)
malloc(3)
返回void*
,可以将其分配给C中的任何其他指针类型,但不能分配给C ++。这是C ++与C不向后兼容的地方之一。您可以执行其他海报所说的内容 - 将其强制转换为char**
,或者一直使用运算符free store usage。 {1}}和new[]
:
delete[]
答案 3 :(得分:1)
也许是演员阵容:
tmp = static_cast<char **>(malloc(sizeof(char*) * mtmp));
答案 4 :(得分:1)
将tmp = malloc(sizeof(char*) * mtmp);
更改为:
tmp = (char**)malloc(sizeof(char*) * mtmp);
并且不要像一些人错误地建议的那样将malloc改为new,因为有两个原因:
1)它没有坏掉,所以不要修理它(!)
2)你可以引入微妙或扁平的可怕虫子,这些虫子会在以后的几个小时内消耗掉。
花时间修复损坏的代码,而不是有效的代码......