Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 为什么;存储大小为';数组';isn';“t常数”;_C_Static - Fatal编程技术网

C 为什么;存储大小为';数组';isn';“t常数”;

C 为什么;存储大小为';数组';isn';“t常数”;,c,static,C,Static,我是C语言的新手。上周,我学习了使用数组来解决问题。我发现当数组的数量太大时,比如1024*1024,它会显示错误。有些人建议我使用static来解决这个问题,但是这个错误(标题)让我更加困惑。我想我已经定义了参数,它应该是常量。但事实并非如此。我不明白 总结: 为什么会发生这种错误 为什么C中的常数不是常数 如果不使用真常数,比如5000,我怎么能解呢 什么功能可以代替静态存储大型阵列 这是文本代码,显示相同的错误 # include <stdio.h> int main() {

我是C语言的新手。上周,我学习了使用数组来解决问题。我发现当数组的数量太大时,比如1024*1024,它会显示错误。有些人建议我使用static来解决这个问题,但是这个错误(标题)让我更加困惑。我想我已经定义了参数,它应该是常量。但事实并非如此。我不明白

总结:

  • 为什么会发生这种错误
  • 为什么C中的常数不是常数
  • 如果不使用真常数,比如5000,我怎么能解呢
  • 什么功能可以代替静态存储大型阵列
  • 这是文本代码,显示相同的错误

    # include <stdio.h>
    
    int main()
    {
        int num = 500;
        static int arr[num] = {0};
        printf("%d",arr[0]);
        return 0;
    }
    
    #包括
    int main()
    {
    int num=500;
    静态int-arr[num]={0};
    printf(“%d”,arr[0]);
    返回0;
    }
    
    具有静态存储持续时间的数组,即在文件范围或使用
    static
    关键字定义的数组,必须具有编译时常量大小。变量的值不是编译时常量,因此会出现错误

    将所讨论的变量声明为
    const
    也不符合条件,因为它只是意味着变量不能修改,而不是它是编译时常量

    您可以做的是对常量使用预处理器符号。这将在编译器运行之前被替换

    #define NUM 500
    
    static int arr[NUM] = {0};
    
    具有静态存储持续时间的数组,即在文件范围或使用
    static
    关键字定义的数组,必须具有编译时常量大小。变量的值不是编译时常量,因此会出现错误

    将所讨论的变量声明为
    const
    也不符合条件,因为它只是意味着变量不能修改,而不是它是编译时常量

    您可以做的是对常量使用预处理器符号。这将在编译器运行之前被替换

    #define NUM 500
    
    static int arr[NUM] = {0};
    

    静态存储持续时间数组大小必须为常量表达式(C17 6.7.6.2/2)

    根据C标准:

    整数常量表达式应具有整数类型,且应 仅具有整数常量、枚举常量、字符常量和sizeof表达式的操作数,这些表达式的结果 是整数常量和浮点常量,它们是 强制转换的立即操作数。整数常量中的强制转换运算符 表达式只能将算术类型转换为整数类型, 除了作为sizeof运算符的操作数的一部分之外

    正如您所看到的,这里没有列出常量整数变量,它们不能被视为常量表达式

    示例:

    #define SIZE 300
    
    int x = 500;
    int a[SIZE];
    int b[SIZE+ 'a'];
    int c[SIZE + sizeof(x)];
    
    /* and even most modern compilers will accept it*/
    
    int d[SIZE + sizeof(x) + (size_t)sqrt(sizeof(c))];
    

    静态存储持续时间数组大小必须为常量表达式(C17 6.7.6.2/2)

    根据C标准:

    整数常量表达式应具有整数类型,且应 仅具有整数常量、枚举常量、字符常量和sizeof表达式的操作数,这些表达式的结果 是整数常量和浮点常量,它们是 强制转换的立即操作数。整数常量中的强制转换运算符 表达式只能将算术类型转换为整数类型, 除了作为sizeof运算符的操作数的一部分之外

    正如您所看到的,这里没有列出常量整数变量,它们不能被视为常量表达式

    示例:

    #define SIZE 300
    
    int x = 500;
    int a[SIZE];
    int b[SIZE+ 'a'];
    int c[SIZE + sizeof(x)];
    
    /* and even most modern compilers will accept it*/
    
    int d[SIZE + sizeof(x) + (size_t)sqrt(sizeof(c))];
    
    为什么会发生这种错误

    在程序开始执行之前,实例化具有静态存储持续时间的对象(为它们预留内存);这意味着必须在编译时知道
    arr
    的大小。尽管我们有一个
    num
    的初始值设定项,但这与编译时已知的
    num
    值不同<在程序开始执行之前,code>num不存在

    在文件范围内(任何函数之外)或使用
    static
    关键字声明的数组必须使用一个常量表达式的大小来声明-要么是一个整数常量,如
    1024
    ,要么是
    sizeof
    表达式,如
    sizeof(some type)
    sizeof some表达式
    ,一种算术表达式,包括前面的表达式(如
    1024*1024
    5000*sizeof(int)
    )或扩展到上述任一表达式的宏。或者,可以声明它们而不使用大小,并且大小取自初始值设定项中的元素数

    为什么C中的常数不是常数

    500
    是常数-
    num
    不是常数。同样,
    num
    在运行时之前不存在,但是在运行时之前必须知道
    arr
    的大小。添加
    const
    关键字,例如

    const int num = 500;
    
    没有帮助-如果你试图给
    num
    赋值,那么
    const
    所做的就是告诉编译器对你大喊大叫。它不会使<代码> num < /Cord>一个常量表达式(无论如何,在C++中,它确实如此)。 如果不使用真常数,比如5000,我怎么能解呢

    此时,您几乎只能使用动态内存

    什么功能可以代替静态存储大型阵列

    使用
    malloc
    calloc
    在运行时为阵列分配空间:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main( void )
    {
      size_t num = 500; // or whatever value you ultimately need
    
      /**
       * Dynamically allocate enough space for "num" objects of type "int". 
       * 
       * calloc will zero out the allocated memory (malloc does not).
       *
       * calloc will return NULL if it cannot satisfy the request, so we
       * want to make sure "arr" isn't NULL before trying to use it. 
       * 
       * The type of the *expression* "*arr" is "int", so "sizeof *arr" == "sizeof (int)"
       */
      int *arr = calloc( num, sizeof *arr ); 
                                             
      if ( arr ) 
      {
        printf( "%d\n", arr[0] );
    
        /**
         * Deallocate "arr" when you're done with it
         */
        free( arr );
      }
      return 0;
    }
    
    这些被称为可变长度数组,工作正常(在大多数C99和更高版本的实现中),但因为它们的大小在运行时之前是未知的,所以不能在文件范围内声明它们,也不能用任何初始值设定项声明它们。与其他
    auto
    数组一样,它们不能任意大。尽管它们的名称不同,但一旦定义,它们就无法调整大小。“变量长度”中的“变量”只是意味着每次实例化时它们的大小可能不同

    为什么会发生这种错误

    具有静态存储持续时间的对象处于