Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,为什么可以';常量变量不能用作数组大小初始值设定项吗?_C - Fatal编程技术网

在C语言中,为什么可以';常量变量不能用作数组大小初始值设定项吗?

在C语言中,为什么可以';常量变量不能用作数组大小初始值设定项吗?,c,C,在以下代码中,const int不能用作数组大小: const int sz = 0; typedef struct { char s[sz]; } st; int main() { st obj; strcpy(obj.s, "hello world"); printf("%s", obj.s); return 0; } 这是一种非常简单的方法,因为编译器必须在编译时知道数组的维数,并且因为您可以在运行时初始化const变量,所以您不能这样做。因此,静态声明数

在以下代码中,const int不能用作数组大小:

const int sz = 0;
typedef struct
{
   char s[sz];
} st;

int main()
{
   st obj;
   strcpy(obj.s, "hello world");
   printf("%s", obj.s);
   return 0;
}

这是一种非常简单的方法,因为编译器必须在编译时知道数组的维数,并且因为您可以在运行时初始化
const变量
,所以您不能这样做。因此,静态声明数组的大小必须是一个常量表达式,而常量变量不是。对于常量表达式,应使用宏(
#define
)或
枚举
。这是明确针对您的情况(在文件范围内)的,如果您在C中使用
c99

的最低标准,则
const
-限定变量不是常量表达式1。常量表达式是可以在编译时进行计算的东西-一个数值文本,如
10
3.14159
,一个字符串文本,如
“Hello”
,一个
sizeof
表达式,或者由类似
10+sizeof“Hello”
的表达式组成的表达式

对于文件范围(任何函数体之外)的数组声明,或者作为
struct
union
类型的成员,数组维度必须是常量表达式

对于
auto
数组(在函数体中声明的数组不是
static
),可以使用在运行时才知道其值的变量或表达式,但只能在C99或更高版本中使用


  • C++在这方面有所不同-在该语言中,
    const
    -限定变量作为常量表达式计算。
    这是因为在C
    const中,const实际上意味着只读。引述:

    const限定符实际上意味着“只读”;这样限定的对象是无法(通常)分配给的运行时对象。因此,const限定对象的值不是完全意义上的常量表达式,不能用于数组维度、大小写标签等。(c与C++不同,)当需要一个真正的编译时常数时,使用一个预处理程序定义(或一个枚举)。 参考文献:国际标准化组织第。6.4 H&S秒。7.11.2,7.11.3第226-7页

    有两种处理方法:

  • 使用
    #define
    而不是
    const
  • 使用
    enum{sz=12}

  • 因为数组大小必须是常量,常量变量是常量变量,而不是常量,这意味着它不能改变语言中的另一个缺陷……这是C++中固定的。@ MGZZ <代码> const 如果变量有<代码> conXPRPR < /C>初始化器,则积分变量隐式地变成<代码> conxPRP< /代码>。因为如果是这样的话,您将有未定义的行为写入零大小的数组。如果不限定
    const
    -限定变量不是常量表达式,则无法断言。虽然C标准不需要常量表达式来包含<代码> const 合格变量,但是C 2018 6.6 10表示“实现可以接受其他形式的常量表达式”(并且相同的文本在C 1999中)C也不同于C++,在<代码> 10 < /Cord>中不被称为数字文字,而是一个整数常量。旁白:与整数常量不同,C的文本、字符串和复合文本可以使用它们的地址。