_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
以上是我读过的实际代码。我只是想知道如果我做什么是差异
_Groups = new group*[sizeof (group **) * NOMGRPS];
答案 0 :(得分:1)
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
这为NOMGRPS
组指针创建了足够的空间,并将其转换为指向group**
的指针,可能用作指向已分配的group
类型对象的指针数组别处。这是(或更严格地说,是)一个常见的习惯用法,因为char
几乎总是单个字节,因此这表示“分配sizeof (group **) * NOMGRPS
个字节(NOMGRPS
组指针的足够字节”和将它转换为指向组指针的指针。因此,如果NOMGRPS
为10,并且您使用的是32位系统,并且有4个字节的指针,则会分配40个字节。
_Groups = new group*[sizeof (group **) * NOMGRPS];
这里没有说你想要40 char
s(即字节),而是说你想要40 group*
。因此,如果NOMGRPS
为10,并且您使用的是32位系统,并且有4个字节的指针,则会分配40 * 4或160个字节。这几乎肯定不是你想要的,但是因为它会分配内存,所以它可能会正常工作。你做这种改变的直觉是正确的。任何时候你使用现代C ++,你应该认为它是可疑的。但是你还没有走得太远。
你真正想要的是:
_Groups = new group*[NOMGRPS];
new
知道group*
的大小,因此会为NOMGRPS
分配足够的内容。这比使用new char
的原始版本更正确。
答案 1 :(得分:1)
我不明白这段代码的意图。我的猜测是为NOMGRPS
分配group
指针的内存,即你需要(NOMGRPS
*指针大小)内存字节。
如果是,那么
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
做你想要的。但是错误的方式。
它为(NOMGRPS
*指针大小)字符分配内存。 char
的大小是1个字节,这就是为什么这行符合您的要求。但是:
1)你需要为指针而不是字符分配内存。
2)您需要为group *
指针分配内存,而不是group **
。所以sizeof (group **)
是错误的。
_Groups = new group*[sizeof (group **) * NOMGRPS];
这为(NOMGRPS
*指针大小)指针分配内存,这不是你想要的。
有效的方式:
_Groups = new group *[ NOMGRPS ];
它为NOMGRPS
的{{1}}指针分配内存。完成任务。
答案 2 :(得分:0)
(Point **) new char[10]
为10 char
分配内存,然后将指针转换为指向Point*
的指针。如果sizeof(char) != sizeof(Point*)
,则可能会崩溃,因为分配的数组大小错误。所以这是完全错误的。