【问题标题】:How to memory allocate a pointer inside a pointer?如何在指针内部分配指针?
【发布时间】:2013-05-31 01:37:42
【问题描述】:

我是 C 编程新手(我的主要领域是 java),在 java 中存在我可以制作的 ArrayList

    ArrayList<Class> arraylist = new ArrayList<Class>();

我的类 Class 可以有多个项目,例如 int 或 string。

在c中,我发现我不能这样做,但需要做类似的事情,所以我这样做了

    typedef struct vectorObject {
      int myInt;
      char *charPointer;
    } vectorObject;

我这样定义我的结构的指针:

    vectorObject *listVectorObject;

并使用

    #define MAX_FILE_SIZE   50000

当我想分配它的内存时,我使用这个:

    int i;
    listVectorObject = malloc(MAX_FILE_SIZE);
    if (listVectorObject == NULL ) {
         printf("Out of memory1\n");
         exit(1);
    }
    for (i = 0; i < MAX_FILE_SIZE; i++) {
         listVectorObject[i].charPointer= malloc(MAX_FILE_SIZE);
         if (listVectorObject[i].charPointer == NULL ) {
              printf("Out of memory2\n");
              exit(1);
         }
    }

问题是我总是得到一个

    Out of Memory2

我已经尝试了所有方法,但我找不到错误在哪里。请你帮助我好吗? 谢谢!!

【问题讨论】:

  • 你的机器有多少内存?是 64 位的吗?
  • 您确定要MAX_FILE_SIZE 迭代吗?
  • 是的,你知道你在这里分配了大约 2.5GB 的内存吗? MAX_FILE_SIZE * MAX_FILE_SIZE = 2500000000.
  • 对于初学者,您没有正确使用malloc。不应该是listVectorOject = malloc(MAX_FILE_SIZE * sizeof(VectorObject));吗?

标签: c pointers memory allocation


【解决方案1】:

我不认为你想要 50000 个向量对象,每个向量对象都有 50000 字节的字符缓冲区。

所以看看这个:

  • 首先列出 1000 个向量对象
  • 然后为每个分配内存块给字符指针的人

.

int i, howmany= 1000;
vectorObject *listVectorObject = malloc(sizeof(vectorObject)*howmany);  // list of 1000 vectorObjects
if (listVectorObject == NULL ) {
     printf("Out of memory1\n");
     exit(1);
}

// one file-size char-pointer for each vector object above
for (i = 0; i<howmany; i++) {
     listVectorObject[i].charPointer= malloc(MAX_FILE_SIZE);
     if (listVectorObject[i].charPointer == NULL ) {
          printf("Out of memory2\n");
          exit(1);
     }
}

【讨论】:

  • 感谢大家的回复!那是回忆! (我愚蠢地认为它不会影响它......把它改成一个更小的数字,它就像一个魅力!)再次感谢!
  • 很高兴听到。请确保也更改第一个 alloc 中的“sizeof(vectorObject)*howmany”。
  • 已经做到了!哇,我喜欢你回复的速度!再次感谢,很抱歉用这么愚蠢的问题打扰您(在 java 中没有必要这样做,所以我有点困惑)
  • 别担心,我们有时已经从那里开始了(从 Java 到 C 将是一条充满陷阱的道路)。
猜你喜欢
  • 2020-12-12
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2015-04-21
相关资源
最近更新 更多