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

C 头文件中缓冲区分配的可能性,c,C,我想知道,在C语言中,是否可以在头文件中分配内存以使我更容易。例如,在我的源代码中,我分配数据缓冲区如下: float *data = malloc((10*10) * sizeof(float)); 我的代码将与其他人的代码进行比较,因此我只想在他的代码中插入我的函数cluster(data,p,dim,…),并且只添加我的头(已经包括所有缓冲区分配)。这有效吗 谢谢,您永远不想这样做,因为每次包含头时都会分配内存,这将是一个非常严重和意外的副作用。头文件的用途是定义接口。内联函数和模板(在

我想知道,在C语言中,是否可以在头文件中分配内存以使我更容易。例如,在我的源代码中,我分配
数据
缓冲区如下:

float *data = malloc((10*10) * sizeof(float));
我的代码将与其他人的代码进行比较,因此我只想在他的代码中插入我的函数
cluster(data,p,dim,…)
,并且只添加我的头(已经包括所有缓冲区分配)。这有效吗


谢谢,

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

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

< P>不,不像C++,在程序启动时,C中不允许在全局范围调用函数。< /P> < P>与C++不同,在程序启动时,C中不允许在全局范围调用函数。

< p>您可以在任何您喜欢的地方包含一个标题,所以如果不是很好的样式< /p>,这是完全合法的。
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文件添加到链接阶段。

你可以在任何你喜欢的地方包含头文件,因此这是完全合法的,即使不是很好的风格

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文件添加到链接阶段。

static inline void cluster(…){…..float*data=malloc((10*10)*sizeof(float));…}
…但应该避免使用邪恶的方法?编译器对您的尝试有何评论?您不使用静态变量的任何原因?
static inline void cluster(…){….float*data=malloc((10*10)*sizeof(float));…}
…但应避免使用邪恶的变量….您尝试了什么?编译器对您的尝试有何评论?您不使用静态变量的任何原因?C程序以main或其他入口点开始。CC++程序从全局范围内调用的函数(通常是构造函数)开始,然后调用Maul.是的,在这个意义上,“PrimaStudio”意味着执行代码> >代码>主代码>代码>。尽管如此,大多数平台都允许在
main
之前调用函数。GNU工具链及其crt通常允许将函数属性化为在resp之前调用的CTOR/DTOR。在
main
之后。对于某些框架来说也是如此。但这并不清楚OP真正想要的是什么。@olaf将问题中的行放在全局范围内,即函数体之外在C中是非法的。clang中的错误“不是编译时常量”@JeremyP:我在哪里说它是有效的?@olaf你对Malcolm答案的批评暗示了这一点。C程序从主入口点或替代入口点开始。CC++程序从全局范围内调用的函数(通常是构造函数)开始,然后调用Maul.是的,在这个意义上,“PrimaStudio”意味着执行代码> >代码>主代码>代码>。尽管如此,大多数平台都允许在
main
之前调用函数。GNU工具链及其crt通常允许将函数属性化为在resp之前调用的CTOR/DTOR。在
main
之后。对于某些框架来说也是如此。但这并不清楚OP真正想要的是什么。@olaf将这一行放在全局范围内的问题中,即放在函数体之外在C中是非法的。clang中的错误“不是编译时常量”。@JeremyP:我在哪里说它是有效的?@olaf这隐含在你对马尔科姆答案的批评中。