C ++中的静态全局变量

我想通过malloc方法创建一个整数数组。 我希望这个数组是全局的,并可以在我的程序中的任何地方使用。 我把代码放在一个如下所示的头文件中:

static int *pieces;

然后我有一个函数,用它填充我想要的数字。 该函数位于命名空间中,命名空间在其自己的.cpp文件中实现。 但是,我将头文件导入到main.c中,并从创建数组的名称空间调用该函数,如下所示:

pieces = malloc(sizeof(int) * 128);

但是当我尝试访问main中的数组(在调用创建我的数组的函数之后)时,它崩溃并且说块没有被初始化。 但在函数中,我可以创建它并在其中操纵数字就好了。 我的印象是,只要某个函数在任何地方发生变化(或设置了它),就会使块变为一个静态变量,这会影响变量在任何地方的使用。 基本上我想说的是,为什么在主要中出现未设置的部分,即使我将其设置为我调用的函数?


Static是一个有很多含义的关键字,在这个特殊情况下,它意味着不是全局的 (释义)

这意味着每个.cpp文件都有自己的变量副本 。 因此,当你在main.cpp初始化时, 它仅在main.cpp初始化 。 其他文件仍然未初始化。

首先要解决这个问题是删除关键字static 。 这会导致“多重定义问题”。 为了解决这个问题,你应该在一个.cpp文件中定义变量,并且只是在头文件中声明它。


编辑:你只是分配内存, 不算作初始化 。 分配后需要将内存初始化为0。

您可以使用new int[128]()而不是更详细的malloc语法,并且这也会执行初始化? 或者你可以走容易的道路(这就是它的目的),并使用std::vector


关键是这样的:

static int *pieces;

你说你把它放在你的标题中。 这不是导出符号的方式。 包含头文件的任何文件都将获得它自己的静态版本的未初始化指针,称为pieces

相反,你把它放在你的标题中:

extern int *pieces;

extern int init_pieces();

在源文件中,您可以这样做:

static const size_t num_pieces = 128;

int *pieces = 0;

int init_pieces()
{
    pieces = malloc( num_pieces * sizeof(int) );
    return pieces != NULL;
}

现在,当你包含你的头文件时,你的源文件将知道从别的地方得到代码pieces ,并且会等待链接器找出它的位置。 我还为数组提供了一个'init'函数。 然而,我没有放置“释放”功能。

注意这是所有C,而不是C ++。 如果你使用C ++,你应该真的使用new或更好的,使用一个vector

另外,当在C ++中使用静态时,请注意这一点:C ++静态初始化顺序


对于各种体系结构中的高性能代码,您可能需要malloc-y分配而不是通用新分配。 这是因为你会用类似mymalloc()的东西包装它,然后使用架构相关函数,比如那些实现适当对齐的函数,以避免缓存未命中,并执行硬件制造商提供的其他漂亮的东西,比如IBM(Bluegene)或英特尔(MIC)。 所有这些优化的分配例程都有malloc类型框架。

链接地址: http://www.djcxy.com/p/35323.html

上一篇: Static global variables in C++

下一篇: static global variable V static global Class variable