仅将内存分配给静态变量一次

时间:2013-01-05 13:40:44

标签: c++ c

  

可能重复:
  Definition of global variables using a non constant initializer

我有这段代码:

#include <stdio.h>
#include <stdlib.h>


int foo (int num, int i)
{
    static int* array = malloc(sizeof(int));  // ERROR HERE!!!
    printf("%d", array[i]);
    return 0;
}



int main(int argc, char *argv[])
{
    int i;
    for (i = 0; i < 2; i++) {
    foo(i, i);
    }

    return 0;
}

我将代码保存为c源文件,我无法工作? error prompt

gcc -O2 -Wall test.c -lm -o test
test.c:4:1: error: initializer element is not constant

Compilation exited abnormally with code 1 at Sat Jan 05 21:33:56

但是,我将其保存为C ++源文件,它可以正常工作。为什么?有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:3)

您无法使用C中的非常量初始值设定项初始化static个对象。

static int* array = malloc(sizeof(int));

                    ^ must be a constant

来自C标准:

  

(C99,6.7.8p4)“具有静态存储持续时间的对象的初始值设定项中的所有表达式都应是常量表达式或字符串文字。”

答案 1 :(得分:2)

C和C ++标准以不同的static存储持续时间处理对象的初始化。 C ++允许静态初始化(即使用常量初始化)和动态初始化(即使用非常量表达式初始化),而C只允许静态初始化 - 即使用常量表达式。

C ++标准的相关部分是6.7.4:

  

在进行任何其他初始化之前,将执行具有静态存储持续时间(3.7.1)的所有本地对象的零初始化(8.5)。在第一次输入块之前,初始化具有使用常量表达式初始化的静态存储持续时间的POD类型(3.9)的本地对象。 [...] 否则这样的对象被初始化,第一次控制通过其声明;这样的对象在初始化完成后被认为是初始化的。(强调添加)

C ++需要额外的“簿记”才能运行初始化程序的动态部分(即malloc的调用)一次。 C标准中没有类似的“动态”规定:

  

具有静态存储持续时间的所有对象应在程序启动之前初始化(设置为其初始值)。   具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。

在没有并发的情况下,您可以像这样重写代码以便与C一起使用:

int foo (int num, int i) {
    static int* array = NULL;
    if (!array) array = malloc(sizeof(int)); // No error
    printf("%d", array[i]);
    return 0;
}

现在您的代码负责“簿记”:在执行分配之前,它会array检查NULL

答案 2 :(得分:1)

C(与C ++不同)不允许使用非常量值初始化静态持续时间变量。

static int* array = malloc(sizeof(int));  // ERROR HERE!!!

C99标准:第6.7.8节:

  

具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。

答案 3 :(得分:1)

它在C中是非法的,但在C ++中没问题,它们是不同的

可写如下:

static int* array = NULL;
if (array == NULL)
    array = malloc(sizeof(int));