数组两种类型定义说明

时间:2015-11-25 11:23:32

标签: c arrays

我对数组定义有疑问。我尝试了两种类型的定义:

第一个定义

uint8_t data_i2c[1] = { 1 };

第二个定义

uint8_t data[1];
data[0] = 1;
data[1] = 2;

在第一种情况下,我有一个1的数组值,如果我添加另一个值(例如{1,2};)我有一个编译错误。 在第二种情况下,我以相同的方式定义了数组,但我在第二次添加了值,如果我添加另一个值(例如data [2] = 3;),我没有编译错误。

Why this difference?

我也检查了调试,即使我定义:

data[1] = 2;
data[2] = 3;

我只能看到数据[0] = 1;

我记得如果我定义了我总是拥有的任何数组,并且可以在索引0中使用值。

我正在使用Atmel Studio作为编译器和C语言。

2 个答案:

答案 0 :(得分:0)

在您的代码中

uint8_t data_i2c[1] = { 1, 2};

会给你一个警告(也可能会根据你的编译选项给你一个错误),因为你使用了多余的初始化元素而不是数组的大小

OTOH,如果是

uint8_t data[1];

data[1] = 2;

因为,您尝试访问超出范围的内存,C标准( C数组未禁止这些内存默认情况下没有任何边界超限检查,记住?)但定义以生成undefined behavior

答案 1 :(得分:0)

在第一种情况下使用初始化程序。在编译时编译器计算初始化列表中的元素大于数组大小的元素,从而产生错误。

在第二个片段中,在运行时执行赋值,并且执行数组写入的超出范围。编译器已经知道你正在访问数组越界。