如何在应用程序开始时分配所有内存,然后在整个过程中对其进行相应的类型化

时间:2013-11-26 18:24:54

标签: c memory casting void-pointers

我需要预先分配我的应用程序将使用的所有内存。然后每当需要使用我需要进行计算的数据覆盖该内存时。内存在任何计算之前首先分配,因为我正在尝试并行运行多线程CUDA算法,如我在这里的问题所解释的那样(Multi-Threaded CPU CUDA application not asynchronous when calling CudaFree)。

我以为我可以将所需的所有内存分配为字节指针,然后将该指针存储为void指针:

void * allocateMemory()
{
    byte *mem;
    int nbytes = 13107200;
    mem = (byte *) malloc(nbytes);
    return mem;
}

稍后在我的程序中,我想使用已分配用于存储数据的内存。我提前不知道数据的类型,但我知道它的大小不会超过分配的限制。

void doSomething(void * mem)
{
    int *a = (int*) mem;
    for (int i = 0; i < 100; i++)
    {
        a[i] = i;
    }

    //do stuff

}

还有许多其他函数,比如上面的doSomething(void * mem),但是使用double类型或者类型float或者甚至可以键入byte。我需要能够用我需要的任何数据类型覆盖orignally分配的内存。上面的代码不起作用,因为它说我无法遵循void指针。它还说我试图读取或写入受保护的内存。

这样做的正确方法是什么?实现我的目标的最佳方法是在开始时分配所有内存然后在整个过程中使用必要的内容?谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你有两个问题。

  1. 无法取消引用void指针。在代码的某处,您使用了allocateMemory()的结果而没有使用强制转换。您提供的代码是正常的,但是编译器标记为错误的任何行都不正常。例如,也许你有:

    void *foo = allocateMemory();
    foo[42];  // compiler doesn't have a real type here - error
    ((int*)foo)[42];  // compiler happy
    
  2. 尝试访问受保护的内存。在代码中的某处,您有一个无效的指针。最可能的原因是allocateMemory()返回NULL(您没有检查)。

  3. 你的一般方法对我来说似乎没问题;您描述的问题与代码中的详细信息有关,而不是整体想法。