How to initialize large size of array to 0 in C
我正在尝试初始化数组的所有列和行,这些列和行的大小为0,而不使用C中的指针。但有时它会崩溃,有时它会显示一条关于"内存不足"的错误消息。我不想在我的应用程序中使用指针。
我有一个局部变量(在函数内部)定义如下:
1
| double myArray[50][785190]={0}; |
我试过上面的代码,但不起作用。
- double myArray[50][785190] = { 0 };在什么方面不起作用?这是在文件范围内还是在局部变量内?您分配了大约3200兆字节;这太大了,不适合大多数堆栈。
- "我不想在我的应用程序中使用指针。"嗯,很难。那个数组太大了。
- 如果你不想在C语言中使用指针,你会很不愉快。
- 大多数机器的堆栈大小限制在8mib或更小。在8mib堆栈中不能可靠地创建320 mib(give或take)数组。如果不需要指针(C中的希望渺茫),则必须将其设置为文件作用域或全局作用域变量-在任何函数之外定义它,并将其设置为文件作用域或全局作用域的static。对于指针,可以使用malloc()等的动态分配。这个问题有很多重复的地方-创建一个大数组会使程序崩溃。
- 我真的不建议在堆上分配150MB。您应该在堆栈上动态地分配它…
- Stasel-但我需要上面提到的尺寸
- 正如@jonathanlefler所说,您的问题不是初始化数组,而是数组的大小。
- 如果您需要上述大小,则显然需要动态分配。故事结束。
- 哎呀…@lordzsolt-我刚刚重新发现了我批评的评论。您说"我真的不建议在堆上分配150MB。您应该在堆栈上动态分配"这是不正确的;请删除注释。问题是在堆栈上分配了局部变量,并且150(300320)MIB对于大多数计算机上的堆栈来说太大。您可以使用malloc()等在堆中动态分配它;您可以将它作为全局或文件范围变量放在"data"或"bss"段中。这两个都不是堆栈。
我认为你可以做到这一点,至少在C++中,不确定是否/何时添加到C中。
1
| double myArray[50][785190]={{0}}; |
但是,正如你所说的,你正在摆脱内存不足的错误。在堆栈上声明300meg通常不是一个好主意。将其移动到全局变量(在任何函数之外),它将不再位于堆栈上。或者宣布为1〔0〕。无论是哪种情况,您的代码都不能用全局数组或静态数组重入,但我假设您不需要这样的数组。
否则你也可以这样做来清除它
1 2
| double myArray [50][785190]
memset(myArray , 0, sizeof(myArray )); |
。
尽管任何一个好的编译器都可能在任何一种风格的框架下生成相同的代码。
如果您不想在二维数组中使用指针,您需要知道数组提前的大小。如果您将数组声明为如下所示:
然后,要初始化它,您应该使用一个嵌套的for循环(在别处声明i和j):
1 2 3
| for(i = 0; i<x; i++)
for(j = 0; j<y; j++)
array[i][j] = 0; |
号
希望这有帮助!
编辑-正如其他人指出的,问题在于尺寸,听他们说!
- @用户2894607分配数组并对其进行初始化的方法是正确的。问题在于分配的内存大小。
- 你在说什么?他用的是double myArray[50][785190],显然阵列的大小是提前知道的。
- 我明白了,我错了!