在c中分配大数组(9mb)指针

时间:2014-02-25 17:58:01

标签: c arrays pointers

我定义了一个结构,

struct RadBuck {
    int size,
    int pos,
    int head
};

我想创建一个这个结构的数组RadBuck *R[n]。如果n很小,一切都很好,但是当我达到9 MB时,我就会出现分段错误。我对int a[n]也有同样的问题,但我通过malloc来克服int *a = (int*) malloc(n*sizeof(int)); 由于结构不可能,我很困惑。

2 个答案:

答案 0 :(得分:2)

  

由于结构不可能,我很困惑。

这肯定 可能:

#include <stdlib.h> /* for malloc() */
#include <stdio.h> /* for perror() */

size_t n = 42;

struct RadBuck * p = malloc(n * sizeof(*p)); /* Here one also could do sizeof(struct RadBuck). */
if (NULL == p)
{
  perror("malloc() failed");
}
else
{
   /* Use p here as if it were an array. */
   p[0].size = 1; /* Access the 1st element via index. */

   (p + n - 1)->size = 2; /* Access the last element via the -> operator. */
}

free(p); /* Return the memory. */ 

不过,它应该是:

struct RadBuck {
  int size;
  int pos;
  int head;
};

使用分号(;)分隔结构的成员声明。

答案 1 :(得分:0)

当您使用malloc或声明大小为n的数组时,编译器会尝试将所需空间分配为内存中的连续空间。因此,如果您需要大量内存,则应尝试使用链接列表而不是向量。当您使用链接列表时,您的元素在内存中是稀疏的,您应该获得更多。 如果要使用链接列表,可以像这样重写结构:

struct RadBuck {
    int size;
    int pos;
    int head;
    struct RadBuck *next;
};