(这个问题早先得到解答,但解决方案无效或者我无法理解!!)
我想使用说2^16*2^16
的大尺寸矩阵。怎么做?
这是我与malloc一起使用的代码:
// nrows=2^16
// ncols=2^16
int **a_matrix = (int**) malloc (nrows *sizeof(int*));
for (int i=0; i<nrows;i++)
a_matrix[i]=(int*) malloc (ncols *sizeof(int));
enter code here
现在当我尝试访问a_matrix[55000][55000]
给出分段错误
我将堆栈大小增加到无限(使用一些命令)但仍然无法正常工作。:( 还有其他办法吗?
编辑:我只想存储1/0所以即使bool也能正常工作。但在这种情况下同样的问题也是如此!
答案 0 :(得分:3)
如果您只想存储布尔值,那么使用打包的位阵列会将存储空间降低到足以使其可能正常工作。在C ++中,您将使用std::vector<bool>
或std::bitset
;在C,
#include <stdint.h>
unit32_t (*a_matrix)[1<<11] = malloc((1 << 16)*sizeof *a_matrix);
为您(如果malloc
调用未失败)提供指向2^16
位2^16
数组的指针。要访问一下,请使用
((a_matrix[row][column >> 5]) >> (column & 0x1F)) & 1
最好将其作为一个功能
int bit_at(int row, int col) {
return ((a_matrix[row][col >> 5]) >> (col & 0x1F)) & 1;
}
或者也许是一个宏。
答案 1 :(得分:2)
您可以尝试std::vector<bool> matrix(0x10000L * 0x10000L);
并像这样访问它:
bool b = matrix[i*0x10000 + j];
matrix[i*0x10000 + j] = true;
这应该少于实施空间的1/8(或者是1/32?)。
答案 2 :(得分:0)
您无法在32位计算机上分配超过2GB(UBUNTU上为3GB)的内存。您可能必须实现自己的malloc()
和您自己的分页系统以及vmm
。