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

标签 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 类型。我需要能够用我需要的任何数据类型覆盖原始分配的内存。上面的代码不起作用,因为它说我不能遵循 void 指针。它还说我试图读取或写入 protected 内存。

执行此操作的正确方法是什么?实现我的目标的最佳方法是什么,即在开始时分配所有内存,然后在整个过程中使用必要的内存?谢谢!

最佳答案

听起来您有两个问题。

  1. 无法取消引用 void 指针。在代码中的某个位置,您使用了 allocateMemory() 的结果,而没有进行强制转换。您给出的代码是可以的,但是编译器将其标记为错误的任何行都是不行的。例如,也许您有:

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

我觉得你的总体方法还不错;您描述的问题与代码中的细节有关,而不是总体思路。

关于c - 如何在应用程序开始时分配所有内存,然后在整个过程中相应地对其进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20224986/

相关文章:

java - 泛型通配符无法转换为泛型类型

c - 如何通过将各自的部分放在不同的位置来链接两个目标文件?

C malloc 只为 int * 分配了 8 个字节

C - 不循环地递归查找子集和

.net - 在 C# 中使用 native DLL

java - `+=` 运算符是否总是创建一个新的字符串对象?

c++ - 分析 stable_sort

c++ - 如何在保持其值的同时将 C++ unsigned char 变量转换为 char 变量

c - 何时释放 mex 文件中分配的内存

parsing - 将芬兰日期字符串解析为 VB6 中的日期类型