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

时间:2010-10-06 02:14:26

标签: 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

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

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

5 个答案:

答案 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)你可以引入微妙或扁平的可怕虫子,这些虫子会在以后的几个小时内消耗掉。

花时间修复损坏的代码,而不是有效的代码......