C 为什么;存储大小为';数组';isn';“t常数”;
我是C语言的新手。上周,我学习了使用数组来解决问题。我发现当数组的数量太大时,比如1024*1024,它会显示错误。有些人建议我使用static来解决这个问题,但是这个错误(标题)让我更加困惑。我想我已经定义了参数,它应该是常量。但事实并非如此。我不明白 总结:C 为什么;存储大小为';数组';isn';“t常数”;,c,static,C,Static,我是C语言的新手。上周,我学习了使用数组来解决问题。我发现当数组的数量太大时,比如1024*1024,它会显示错误。有些人建议我使用static来解决这个问题,但是这个错误(标题)让我更加困惑。我想我已经定义了参数,它应该是常量。但事实并非如此。我不明白 总结: 为什么会发生这种错误 为什么C中的常数不是常数 如果不使用真常数,比如5000,我怎么能解呢 什么功能可以代替静态存储大型阵列 这是文本代码,显示相同的错误 # include <stdio.h> int main() {
# 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
数组一样,它们不能任意大。尽管它们的名称不同,但一旦定义,它们就无法调整大小。“变量长度”中的“变量”只是意味着每次实例化时它们的大小可能不同
为什么会发生这种错误
具有静态存储持续时间的对象处于