C存储大小不是常数......为什么?

时间:2013-09-01 21:04:50

标签: c size storage constants

这是简单的示例程序

#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 *并且其大小在执行过程中不会改变时,存储大小不是常量。这只是编译器不够聪明而不知道的情况吗?

4 个答案:

答案 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),在我看来更有可能发挥作用。