为什么不能使用const int初始化char数组的大小?

问题描述

以下代码段在C中是非法的,但在C ++中则可以正常工作。

为什么我们不能使用const来帮助初始化C语言中数组的长度?

#include <stdio.h>
#include <string.h>

int main () {

   const int size = 6;
   char name[size] = "hello";
   printf("%s",name);

   return 0;
}

解决方法

在C语言中,大小不是整数常量表达式的数组是可变长度数组,由于无法在编译时知道它们的大小,因此无法初始化此类数组时间。

带有const限定词的变量不会计为C中的整数常量表达式,因此使name成为可变长度数组,导致您尝试时出错对其进行初始化。

另一方面,C ++对于常量有不同的规则。一个const限定变量,其初始值设定项是整数常量表达式 在C ++中被视为编译时常数,因此可以初始化使用此类变量指定其大小的数组。 ,

C标准允许C编译器支持可变长度数组。用作数组大小的变量的const限定词不会在C中生成与C ++相反的常量整数表达式。

来自C标准(6.6常量表达式)

6 整数常量表达式117)应具有整数类型,并且应 仅具有整数常量,枚举常量, 字符常量,其结果为整数的表达式的大小 常量和作为常量的立即数的浮点常量 演员表。整数常量表达式中的强制转换运算符应仅 将算术类型转换为整数类型,但作为 操作数为sizeof运算符。

此引号中的整数或字符常量一词表示文字。

那么对于可变长度数组(C标准6.7.6.2数组声明符)

4如果不存在大小,则数组类型为不完整的类型。如果 大小是*而不是表达式,数组类型是 未指定大小的可变长度数组类型,只能使用 在具有函数原型范围的声明或类型名称中;这样 数组仍然是完整的类型。如果大小是整数 常数表达式,并且元素类型具有已知的常数大小, 数组类型不是可变长度数组类型;否则, 数组类型是变长数组类型。 (可变长度数组 是实现不需要支持的条件功能;看到 6.10.8.3。)

某些C ++编译器可以具有自己的语言扩展,从而也可以在C ++程序中使用可变长度数组。但这不是X ++标准功能。

即使C ++编译器支持可变长度数组,也最好使用标准类模板std::vector而不是可变长度数组。

请注意,声明它们时,不得在C中初始化可变长度数组。可变长度数组具有自动存储持续时间。您可以将sizeof运算符应用于在运行时求值的可变长度数组。

这是一个使用可变长度数组的演示程序。

#include <stdio.h>

void f( size_t,size_t,int[][*] );

void f( size_t m,size_t n,int a[][n] )
{
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            a[i][j] = n * i + j;
        }
    }
}

void g( size_t,int[][*] );

void g( size_t m,int a[][n] )
{
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            printf( "%2d ",a[i][j] );
        }
        putchar( '\n' );
    }
}

int main(void) 
{
    const size_t m1 = 3,n1 = 3;
    int a[m1][n1];
    
    f( m1,n1,a );
    g( m1,a );
    
    putchar( '\n' );
    
    const size_t m2 = 4,n2 = 5;
    int b[m2][n2];
    
    f( m2,n2,b );
    g( m2,b );
    
    putchar( '\n' );
    
    return 0;
}

程序输出为

 0  1  2 
 3  4  5 
 6  7  8 

 0  1  2  3  4 
 5  6  7  8  9 
10 11 12 13 14 
15 16 17 18 19

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...