【问题标题】:C Initializer element is not constant [What's the difference between array and variable]C Initializer element is not constant [数组和变量有什​​么区别]
【发布时间】:2015-09-18 09:20:51
【问题描述】:

我有以下代码片段

 #include <stdio.h>

 int a[4];
 int b;
 struct test {
         int *ptr;
         int val;
 };

 struct test test_array[] = {
         {
                 a, //Don't understand here
                 b  //compile error 
         }
 };

 int main() {
         struct test ha = test_array[0];
         ha.ptr[0] = 10;
         printf("%d\n", ha.ptr[0]);
         return 0;
 } 

从以下链接,我知道为什么会发生编译错误。 C - initializer element is not constant

但是就是不明白为什么静态存储数组就可以了?

谢谢

【问题讨论】:

  • 抛开语法问题不谈,当您认为用另一个未初始化变量的值来初始化一个变量是有意义的时候,您在想什么?
  • @Lundin 我想这里的这个来源不应该是完成版。
  • @Lundin:具有静态存储持续时间的变量总是初始化。
  • @KerrekSB 我的评论只是呼吁常识。当然,您认为写val=bval 初始化为零是没有意义的,只是因为您知道b,具有静态存储持续时间,被隐式初始化为零?而不是一开始就写val=0;
  • 其实我对b犯了错误,我只是尝试是否数组[即'a'] 是否可以。

标签: c arrays


【解决方案1】:

C中全局变量的初始化器需要是常量表达式,b不是常量表达式。 (它甚至不是const 变量。)相比之下,表达式a 是全局数组a 的第一个元素的地址,而全局变量的地址 常量表达式。

在更高的层次上回答你的问题:ab 的区别在于你使用的是b,而不是a 的值,只有它的地址

【讨论】:

    【解决方案2】:

    b 不是常数,如前所述。至于 a,变量的内容也不是恒定的,但您在结构中获取的只是该数组的地址。这在编译时是不变的并且是已知的。

    【讨论】:

    • 这个答案有点松散:如果您在文件范围内说const int a = 3;,则常量将在编译时已知,但C doesn't allow it as an initializer。最终,答案是 C 是这样指定的,尽管这可能并不令人满意。它只是没有一个非常复杂的常量表达式概念。
    • 没错,你说得更好。但你明白了。
    • 结果是,考虑编译器的详细操作对于理解一门语言通常没有用处……对人类来说完全有意义的东西对 C 来说可能没有意义。
    猜你喜欢
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多