【问题标题】:how to allocate large arrayes using C in linux如何在linux中使用C分配大数组
【发布时间】:2016-08-17 00:34:47
【问题描述】:

有没有办法分配这样大小的数组:

unsigned long M[2000][900000] ;

这是我运行程序时得到的(编译期间没有错误)。

Processus arrêté (Process stopped)  

【问题讨论】:

  • 再看shell配置,他以为他在编码Matrix :D
  • 请注意这个数组的大小是 6.7GB。你的机器上有那么多内存吗?
  • 该数组至少大约 7GB。你真的需要这么大的数组吗?如果这样做,您的逻辑/算法可能会遇到更深层次的问题。
  • 我需要一个正好这个大小的数组(谢谢你的评论,但它没有帮助,是的,我知道 malloc 是什么)
  • 为什么不给这个数组静态存储时长呢?那应该可以。

标签: c linux memory allocation


【解决方案1】:
unsigned long (*pM)[2000][900000] = malloc(sizeof *pM);

完成这项工作。

这样使用

#define ROWS_MAX (2000)
#define COLUMNS_MAX (900000)

...

unsigned long (*pM)[ROWS_MAX][COLUMNS_MAX] = malloc(sizeof *pM);

/* 1st test whether the allocation succeeded! */
if (NULL == pM)
{
  perror("malloc() failed");
  exit(EXIT_FAILURE);
}

/* Then initialise the array. */
for (size_t row = 0; row < ROWS_MAX; ++row)
{
  for (size_t column = 0; column < COLUMNS_MAX; ++column)
  {
    (*pM)[row][column] = 42;
  }
}

/* Do something ... */
...

/* Deallocate, free the memory. */
free(pM);

使用多个块或内存的另一种方法是使用分散/稀疏数组:

unsigned long ** ppM = malloc(ROWS_MAX * sizeof *ppM);
if (NULL == ppM)
{
  perror("malloc() for row pointers failed");
  exit(EXIT_FAILURE);
}

for (size_t row = 0; row < ROWS_MAX; ++row)
{
  ppM[row] = malloc(COLUMNS_MAX * sizeof *ppM[row]);
  if (NULL == ppM[row])
  {
    perror("malloc() for a column failed");
    exit(EXIT_FAILURE);
    /* If not exiting the process here (but probably return from the function
       we are in), we need to perform a clean-up on what had been allocated 
       so far. See below code for free()ing it as a hint how to approach this. */
  }
}

/* Then initialise the array. */
for (size_t row = 0; row < ROWS_MAX; ++row)
{
  for (size_t column = 0; column < COLUMNS_MAX; ++column)
  {
    ppM[row][column] = 42; /* Note the difference how to access the array. */
  }
}

/* Do something ... */
...

/* Deallocate, free the memory. */
/* Free columns. */
for (size_t row = 0; row < ROWS_MAX; ++row)
{
  free(ppM[row]);
}

/* Free row pointers. */
free(ppM);

【讨论】:

  • 还有这样的malloc() 检查结果在我看来不是空的。
  • 它不起作用:malloc() 失败:无法分配内存
  • .. 或者去一个分散的数组。更新我的答案。
  • @AbderrahmaneMechri:所以你想增加操作系统的交换空间。或者看看ulimit 告诉你的关于当前配置的每个进程允许的最大内存。
  • 我认为你的意思是“稀疏数组”,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2018-09-21
  • 1970-01-01
  • 2019-02-24
  • 2012-11-15
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多