Arrays 如何动态分配阵列的大小? 包括 int main(){ int num=10; int-arr[num]; for(int i=0;i,因为这将访问每个索引,0:9/< P>您学习C或C++?< /P>

Arrays 如何动态分配阵列的大小? 包括 int main(){ int num=10; int-arr[num]; for(int i=0;i,因为这将访问每个索引,0:9/< P>您学习C或C++?< /P>,arrays,dynamic,size,Arrays,Dynamic,Size,我的一些同事说这个代码是不正确的,是非法的。但是,当我运行它时,它工作正常,没有任何错误。他不知道如何解释它为什么工作,为什么我不应该这样编码。你能帮帮我吗。我是一名初学者,我想学习C。虽然不一定是非法的,但这段代码不会达到您的目的。在声明数组时,声明要存储的项目数,在本例中为num。因此,当您声明num=10和arr[num]时,您会得到一个可以容纳10个整数的数组。C数组的索引是从0开始的,因此索引是0-9,而不是1-10。这可能就是他们所说的非法。由于您正在写入arr[num]或arr[1

我的一些同事说这个代码是不正确的,是非法的。但是,当我运行它时,它工作正常,没有任何错误。他不知道如何解释它为什么工作,为什么我不应该这样编码。你能帮帮我吗。我是一名初学者,我想学习C。

虽然不一定是非法的,但这段代码不会达到您的目的。在声明数组时,声明要存储的项目数,在本例中为
num
。因此,当您声明
num=10
arr[num]
时,您会得到一个可以容纳10个整数的数组。C数组的索引是从0开始的,因此索引是0-9,而不是1-10。这可能就是他们所说的非法。由于您正在写入
arr[num]
arr[10]
,因此试图使用超出为阵列分配的内存的内存


另外,如果我正确理解了程序的意图,那么您需要用数字1-10填充数组。为此,您需要单独访问每个索引。您就快到了,唯一的问题是
arr[num]=i+1。如前所述,它超出了数组的末尾。但是,您可能应该使用I作为索引,所以<代码> ARR[i] < /C>,因为这将访问每个索引,0:9/

< P>您学习C或C++?< /P> 你同事的意思是,在你的代码中,你做的事情与你想要的不同。这是因为一些额外的因素。因为C/C++标准在不断发展,编译器也在不断发展。让我给你看看

静态阵列 当您是初学者时,通常建议您坚持“给定大小的编译类型数组”是
int-arr[N]
,其中N是一个常量。您在上分配它,而不管理它的内存

在C++11中,可以使用constexpr(常量表达式),但它仍然不是任意变量

在C++14中,可以使用“简单表达式”来表示大小,但在事先得到数组概念之前,不应该尝试很多。另外,GCC编译器提供了一个扩展来支持可变大小的数组,它可以解释“为什么代码可以工作”

注意:可变大小数组与动态数组不同。它们也不是C/C++指南第一章中的静态数组

还有一种现代方法–
std::array,但再一次,不要从它开始

动态数组 当您需要在运行时创建数组时,所有内容都会更改。首先,你把它分配给你自己,或者你自己记忆它(如果你不这样做,你会得到内存泄漏,纯C方式)或者使用特殊的C++类,比如<代码> STD::向量< /代码>。同样,在了解纯C数组之后,应该使用向量

你的同事一定是这么想的:

int* arr = new int[some_variable]; // this is dynamic array allocation
delete[] arr; // in modern C/C++ you can write "delete arr;" as well

因此,您的编译器使它在这种情况下工作,但您绝对不应该依赖于您尝试过的方法。这根本不是数组分配

TL;医生:

  • C++可变长度数组不合法
  • g++编译器允许可变长度数组,因为C99允许它们
  • 记住C和C++是两种不同的语言< /LI>
  • 问题中的代码似乎没有实现您希望它实现的功能
  • 正如其他人提到的,它应该是
    arr[i]=i+1
    ,否则您将一直分配给相同的数组项

如果要动态分配长度为n
int
s的数组,则需要使用malloc或calloc。Calloc是数组分配的首选,因为它具有内置的乘法溢出检查

int num=10;
int*arr=calloc(num,sizeof(*arr));
//用arr做任何你需要做的事
免费(arr);
arr=NULL;

无论何时使用
malloc
calloc
分配内存,请务必记得
释放它,然后将指针设置为NULL,以防止将来意外引用,以及防止双重空闲。

您试图实现什么?我尝试使用num的值作为数组的大小来创建数组这在某种程度上是正确的,除了for循环中的一个小问题
arr[num]=i+1
只是意味着每次都要将第11个元素更改为
i+1
,但没有第11个元素,因为您分配了10个元素的大小,但在c中,我们计算
0-9
。我想知道这样计算数组的长度是否合适。是的,这很好。但是,如上所述,这将是一个静态分配,而不是动态分配。