我想知道C中是否可以在头文件中分配内存以方便我。例如,在我的源代码中,我分配data
缓冲区,如下所示:
float *data = malloc((10*10) * sizeof(float));
我的代码将与其他人的代码进行比较,因此我只希望在他的代码中插入我的函数cluster(data, p, dim, ...)
,并添加我的标题(其中已包含所有缓冲区分配)。这有效吗?
谢谢,
答案 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程序启动时不允许在全局范围内调用函数。