Visual C结构数组-表达式必须具有常数值

时间:2018-10-30 13:27:55

标签: c visual-studio

我正在尝试创建一个结构数组,但一直出现此错误。 你能告诉我吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MODEL_LENGTH 4
#define NUM_OF_DESTINATIONS 8
#define MAX_DESTINATIONS_WORD_LENGTH 12
#define NUM_OF_PLANES 3
typedef struct
{
    char p_model[MODEL_LENGTH];
    char p_destinations[NUM_OF_DESTINATIONS][MAX_DESTINATIONS_WORD_LENGTH];
} airplane;

 airplane  a_737 = { "737", {"Larnaca", "Athens", "Budapest", "Zurich", 
"London", "Paris", "Rome"} };
 airplane  b_747 = { "747", {"London", "New York", "Bangkok"} };
 airplane  c_787 = { "787", {"London", "New York", "Los Angeles", "Hong 
Kong", "Miami"} };

airplane planes_arr[NUM_OF_PLANES] = { a_737, b_747, c_787 };

我以前使用数字而不是#define,在阅读帖子后,我对其进行了更改,但是我仍然不明白这里出了什么问题。

更新: 我尝试将数组更改为“ airplane * planes_arr []”。 我尝试输入:     airplane *a_ptr = &a_737; 并尝试将“ a_ptr”放入数组中,但我不断收到相同的错误。

现在,我更改为:     airplane *planes_arr[NUM_OF_PLANES] = { &a_737, &b_747, &c_787}; 并没有显示错误。

请问对此主题的解释吗?

2 个答案:

答案 0 :(得分:2)

尝试使用适当的常量初始化整个数组:

airplane planes_arr[NUM_OF_PLANES] = {
    { "737", {"Larnaca", "Athens", "Budapest", "Zurich", "London", "Paris", "Rome"}},
    { "747", {"London", "New York", "Bangkok"}},
    { "787", {"London", "New York", "Los Angeles", "Hong Kong", "Miami"}}
};

并在函数内定义单个变量(为什么不使用数组元素??

int main(void) {
    airplane a_737 = planes_arr[0]; // copy
    airplane b_747 = planes_arr[1];
    airplane c_787 = planes_arr[2];
}

答案 1 :(得分:1)

  

请问对此主题的解释吗?

这对数组(虽然是cpp)有些微不足道,但我相信是相关的:

https://www.learncpp.com/cpp-tutorial/61-arrays-part-i/

问题是“声明一个固定数组时,该数组的长度(在方括号之间)必须是一个编译时常量”(来自learncpp.com)

编译和运行之间有区别。要获取a_737等的值,不仅需要编译程序,还需要运行程序。因此a_737 ...等的值在编译时无法确定。

尽管内存地址(即&a_787等)是由编译器在编译时确定的。

如果您尝试

airplane *a_ptr = &a_737;
airplane *planes_arr[NUM_OF_PLANES] = { a_ptr, &b_747, &c_787 };

然后必须在运行时完成对a_ptr的分配。并且不是编译时间常数,因此会遇到相同的错误。 C编译器不是很“智能”,因为它们在编译之前不会运行分配。

即使您可以事先编写分配,但在全局范围中没有预先确定的顺序供编译器理解。但是,此代码将在非全局范围(例如函数)中运行,因为它们现在将按顺序编译和执行。

这里有类似的问题?

'Initializer not constant' on global variable?