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

标签 c

我想知道在 C 中是否可以在头文件中分配内存以便于我使用。例如,在我的源代码中,我像这样分配 data 缓冲区:

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

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

谢谢,

最佳答案

你可以在任何你喜欢的地方#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;
}

但是,如果您将其放在 header 中,就会面临链接时间重复符号的危险。如果将其设为静态,您将获得在包含 header 的每个编译单元中定义的相同功能。

然而,正如 olaf 所观察到的,您对 malloc 的参数是不变的,因此您可以只定义一个静态数组:

static float data[10 * 10];

但是,您仍然会为每个编译单元获得一个新实例。

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

关于c - 头文件中缓冲区分配的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138597/

相关文章:

c - 检测 MPEG-4 传输流中的 I 帧数据

c++ - 编写符合严格别名的 memcpy

c++ - 相同的 C 源代码,不同的输出

c - 套接字是否允许在 C 中是全局的?

c - 汇编维吉尼亚密码程序

c - sprintf 弄乱了我的指针和数据?

c - 如何在C中声明全局变量?

c - 自定义 strcmp 中的奇怪错误 (C)

c - 如何检查最后四位中的至少三位 (LSB) 是否打开

检查 pthread_cond_t 的值