这是简单的示例程序
#include <stdio.h>
#include <string.h>
const char *hello_string = "Hello";
int main(void)
{
char *world_string = " World";
static char hello_world[strlen(hello_string)+strlen(world_string)];
strcpy(&hello_world[0], hello_string);
strcat(&hello_world[0], world_string);
printf("%s\n", hello_world);
return 0;
}
编译器输出:
test.c: In function ‘main’:
test.c:9:13: error: storage size of ‘hello_world’ isn’t constant
static char hello_world[strlen(hello_string)+strlen(world_string)];
^
我意识到在这种情况下完全无用且不必要地使用“静态”会导致错误并且删除它会使编译正常。这只是一个简单的例子来说明我的问题。
我不明白为什么当“hello_string”被声明为 const char *并且其大小在执行过程中不会改变时,存储大小不是常量。这只是编译器不够聪明而不知道的情况吗?
答案 0 :(得分:4)
strlen
是一个功能。它的返回值无法在编译时计算。
答案 1 :(得分:3)
当编译器抱怨存储大小不是常量时,隐式意味着编译时常量,即编译器在编译时可以确定的值。 strlen
的调用显然会在运行时发生,因此编译器无法知道数组的大小。
试试这个:
#include <stdio.h>
#include <string.h>
const char hello_string[] = "Hello";
int main(void)
{
char world_string[] = " World";
static char hello_world[sizeof hello_string + sizeof world_string];
strcpy(&hello_world[0], hello_string);
strcat(&hello_world[0], world_string);
printf("%s\n", hello_world);
return 0;
}
答案 2 :(得分:1)
您在数组声明中使用了static
存储类speficier。
static
数组只能具有固定长度:即,数组的大小必须是整数常量表达式。涉及函数调用的表达式不是常量表达式。
如果要使用可变长度数组,请删除static
说明符。然后不要忘记在数组中为null终止符保留一个额外的字符。
答案 3 :(得分:0)
strlen()
是函数调用。编译器不知道它的作用。
试试sizeof (*hello_string)
。我不确定这是否有效。
或const char hello_string[] = "Hello"
和sizeof(hello_string)
,在我看来更有可能发挥作用。