2

(这个问题前面已经回答了,但是解决方案不起作用或者我无法理解!!)
我想使用大尺寸的矩阵说。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 也可以工作。但在那种情况下也是同样的问题!

4

3 回答 3

3

如果您只想存储布尔值,则使用打包的位数组会大大减少存储空间,以至于它可能会起作用。在 C++ 中,您将使用 astd::vector<bool>或 a 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;
}

或者也许是一个宏。

于 2012-10-23T20:02:44.273 回答
2

您可以尝试std::vector<bool> matrix(0x10000L * 0x10000L);像这样访问它:

bool b = matrix[i*0x10000 + j];

matrix[i*0x10000 + j] = true;

这应该占用您实现空间的不到 1/8(或者是 1/32?)。

于 2012-10-23T19:59:17.790 回答
0

您不能在 32 位机器上分配超过 2GB(在 UBUNTU 上为 3GB)的内存。您可能必须实现自己malloc()的分页系统和vmm.

于 2012-10-23T19:48:10.230 回答