首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么初始化时需要堆分配数组的大小?

为什么初始化时需要堆分配数组的大小?
EN

Stack Overflow用户
提问于 2015-06-05 18:41:29
回答 2查看 181关注 0票数 6

当我可以写的时候

代码语言:javascript
运行
复制
int n[] {1, 2, 3};

我不会写

代码语言:javascript
运行
复制
int *m = new int[] {1, 2, 3};

这应该是

代码语言:javascript
运行
复制
int *m = new int[3] {1, 2, 3};

这是什么原因呢?

EN

回答 2

Stack Overflow用户

发布于 2015-06-05 18:56:39

记住,实际上是C++中的一个运算符。

这是因为new运算符是如何定义的;即,它需要显式地将请求的内存大小作为输入参数。因此,它不会通过初始值设定项列表成员的计数来推断。

票数 0
EN

Stack Overflow用户

发布于 2015-06-05 19:03:34

要理解这一点,您需要了解new操作符works.new如何返回指向分配的新内存块的开头的指针。所以当我们说

代码语言:javascript
运行
复制
int* p = new int;

我们分配内存来包含一个单一的元素。但是当我们说

代码语言:javascript
运行
复制
int* foo = new [3];

我们为int类型的元素分配一个内存块,其中"3“是整数类型的内存块的数量。这将告诉编译器为3个整数分配内存。当我们这样做的时候

代码语言:javascript
运行
复制
int* p = new int[3]{1,2,3}

我们要求编译器分配3个内存位置来存储整型的值。同时,我们也为这些内存位置赋值。

现在如果我们这样做

代码语言:javascript
运行
复制
 int* p = new int[] {1,2,3}

我们没有告诉编译器要分配多少内存,但同时我们试图分配给3个内存位置,但我们没有分配那么多内存。在这种情况下,编译器只分配1块内存。所以第一个值被赋值。这将导致运行时错误。

现在奇怪的是,如果下面的代码是允许的,并且编译器足够智能,可以分配3个值

代码语言:javascript
运行
复制
int n[] = {1, 2, 3}

为什么不在这种情况下呢?

代码语言:javascript
运行
复制
int *p = new int [] {1,2,3}

我认为这就是问题所在,因为新的运算符是如何设计的。你可以试着重载new操作符来解决这个问题。

希望这能有所帮助。

编辑:我在VS中尝试了一些虚拟代码。看起来如果你这么做

代码语言:javascript
运行
复制
int* p = new int [] {1,2,3}

这是一次崩溃。但是当你这样做的时候

代码语言:javascript
运行
复制
int* p = new int []{1}

这完全没问题。这证明编译器将其解释为仅分配1块内存的命令。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30664512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档