头文件中缓冲区分配的可能性

时间:2017-05-23 15:06:50

标签: c

我想知道C中是否可以在头文件中分配内存以方便我。例如,在我的源代码中,我分配data缓冲区,如下所示:

float *data = malloc((10*10) * sizeof(float));

我的代码将与其他人的代码进行比较,因此我只希望在他的代码中插入我的函数cluster(data, p, dim, ...),并添加我的标题(其中已包含所有缓冲区分配)。这有效吗?

谢谢,

3 个答案:

答案 0 :(得分:2)

你可以在任何你喜欢的地方#include一个标题,所以如果不是很好的风格,这是完全合法的

int myFunction()
{
#include "myfile.h"
}

然而,它对我来说看起来很可怕,并且值得投票给遗忘。

你遇到的问题是你的行

float *data = malloc((10*10) * sizeof(float));

在函数体外是非法的。你有两种解决方法。你可以将它包装在一个函数中:

float* getFloatArray(int count)
{
    return malloc(count * sizeof(float));
}

如果您只想要一个实例,即使您多次调用它也是如此:

float* getFloatArray(int count)
{
    static float* singleton = NULL;
    if (singleton == NULL)
    {
        singleton = malloc(count * sizeof(float));
    }
    return singleton;
}

但是,如果将其放在标题中,则存在获取链接时间重复符号的危险。如果你将它设置为静态,你将获得在包含标题的每个编译单元中定义的相同功能。

正如olaf所观察到的,你对malloc的参数是常量,所以你可以定义一个静态数组:

static float data[10 * 10];

但是,您仍将为每个编译单元获取一个新实例。

我会将它(数组或函数)添加到新的.c文件中,并在标题中添加extern def,然后将c文件添加到链接阶段。

答案 1 :(得分:1)

你永远不想这样做,因为你每次包含标题都会分配内存,这将是非常严重和意想不到的副作用。头文件的目的是定义一个接口。内联函数和(在C ++中)使用模板有一些罕见的技术异常,这可能需要直接在标题中提供实现。

答案 2 :(得分:-1)

不,与C ++不同,C程序启动时不允许在全局范围内调用函数。