8

这是简单的示例程序

#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

4 回答 4

5

当编译器抱怨存储大小不是常量时,隐含地意味着编译时常量,即编译器可以在编译时确定的值。的调用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;
}
于 2013-09-01T21:18:57.193 回答
4

strlen是一个函数。它的返回值无法在编译时计算。

于 2013-09-01T21:08:20.880 回答
2

static您在数组声明中使用了存储类指定器。

static数组只能有固定长度:即数组的大小必须是一个整数常量表达式。涉及函数调用的表达式不是常量表达式。

static如果要使用可变长度数组,请删除说明符。然后不要忘记在数组中为空终止符保留一个额外的字符。

于 2013-09-01T21:18:32.127 回答
0

strlen()是一个函数调用。编译器不知道它做了什么。

试试sizeof (*hello_string)。我不确定这是否可行。

const char hello_string[] = "Hello"and sizeof(hello_string),在我看来这更有可能奏效。

于 2013-09-01T21:09:42.857 回答