首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c中分配指针的大数组(9mb)

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

Stack Overflow用户
提问于 2014-02-25 17:58:00
回答 2查看 86关注 0票数 0

我已经定义了一个结构,

代码语言:javascript
复制
struct RadBuck {
    int size,
    int pos,
    int head
};

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-25 18:05:14

因为这是不可能的结构,我很困惑。

当然,可能的:

代码语言:javascript
复制
#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. */ 

顺便说一句,它应该是:

代码语言:javascript
复制
struct RadBuck {
  int size;
  int pos;
  int head;
};

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

票数 2
EN

Stack Overflow用户

发布于 2014-02-25 18:51:54

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

代码语言:javascript
复制
struct RadBuck {
    int size;
    int pos;
    int head;
    struct RadBuck *next;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22022323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档