我有以下指针。
char **x = NULL;
x将指向一个指针数组。以下代码是正确的吗?
x = new (nothrow) (*char)[20];
我们将使用
处理它delete[] x;
时
x = (char **) malloc(sizeof(char **) * 20);
和
x = new (nothrow) (*char)[20];
等效?
答案 0 :(得分:7)
除了unwind提到的指针语法之外,它是等价的:在两种情况下都会分配和删除20个字符*的数组。
C ++ - 熟练的警告:改为使用std::vector< std::string >
:)不需要内存管理。
答案 1 :(得分:4)
不,该代码存在语法错误。星号在类型名称之后,以形成指向该类型的指针。所以它是:
char*
不
*char
在使用malloc()
的“C风格”示例中有这个权利,但在C ++中没有这个权利,这很奇怪。
正如许多评论者已经指出的那样,malloc()
还有其他问题及其对sizeof
的使用。但至少它的类型名称是正确的。就个人而言,如果可能的话,我反对在malloc()
调用中重复类型名称,所以我会像这样写这个版本,以分配一个包含20个字符指针的动态数组:
char **x;
x = malloc(20 * sizeof *x);
这样:
x
点数的20倍”,即单个char *
指针大小的20倍。wchar_t **x
,这仍然有效,而不是偶然。malloc()
时更自然。在C ++中,您需要转换返回值。在C中,你永远不应该这样做。答案 2 :(得分:2)
在C ++中引入了New。 Malloc是C。
你不应该混合和匹配它们...即不要在你使用过malloc的东西上使用删除。查看this文章。
答案 3 :(得分:1)
我问你为什么要首先分配这样的东西。在C ++中,std :: string的std :: vector更可能是你需要的。