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

标签 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*”到类型“char**”的无效 static_cast。

编辑 3:

好的,reinterpret_cast 有效,但替换 mallocs 的解决方案似乎更加简单,所以我将采用它。

但是,函数末尾没有free(tmp)。如果我不放入 delete tmp[],这是个问题吗?

编辑 4:我应该补充一点,tmp 是由函数返回的,因此删除 tmp 是必要的,还是这是自动的?

好的,我将此标记为已解决。感谢您的帮助。

最佳答案

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);

关于c++ - char* 和 char** 的问题 (C --> C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869078/

相关文章:

c++ - 损坏的 CPUID 品牌字符串?

c++ - 我应该如何更改此功能以删除 1 个特定条目(姓名和电话号码),而不是整个记录(此功能当前正在执行)?

c++ - 塞类的 Qt4 : QSymbianLeaveException(KErrAlreadyExists) in (all) applications with text rendering

c - 执行 bash 命令并在 C 中获取输出

c - 为一个指针赋值另一个指针的值

c++ - 如何比较两个包含十进制值的字符串?

c - BYTE BCD 到 ASCII 转换优化

c - 缓冲区的指针与双指针

pointers - 如何将函数指针存储在向量中?

c - C 标准是否允许为指针分配任意值并递增它?