在下面的代码中,我在数组中插入了6个元素。但是,数组大小为5,for循环运行7次。然后,代码将插入并打印7个元素。
看来数组的大小并不重要,因为我显然可以插入并打印更多的元素。如果是这样,那为什么还要声明数组的大小呢?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int index, block[5], number;
printf("\nEnter number of elements which you want to append :");
scanf("%d", &number);
printf("\nEnter the values :");
for (index = 0; index <= number; index++)
{
scanf("%d", &block[index]);
}
for (index = 0; index <= number; index++)
{
printf("%d\t", block[index]);
}
return (0);
}
输出:
Enter the values :1
2
3
4
5
6
7
1 2 3 4 5 6 7
答案 0 :(得分:4)
C语言具有undefined behavior的概念。这意味着该语言不会阻止您执行不应执行的操作,但是如果您执行了该操作,则无法保证程序随后将执行的操作。
它可能会崩溃,它可能会输出奇怪的结果,或者它似乎可以正常工作。如果您进行了看似无关的代码更改,例如添加未使用的局部变量,添加用于调试目的的printf
调用或使用不同的优化设置进行编译,则未定义行为的表现方式可能会发生变化。
在这种情况下,您“很幸运”,似乎没有坏事发生。其他人运行同一程序可能会从您那里获得不同的输出,因为您写的是数组末尾。
运行此代码时,我得到以下输出:
Enter number of elements which you want to append :6
Enter the values :1
2
3
4
5
6
7
*** stack smashing detected ***: ./x1 terminated
1 2 3 4 5 6 7 Aborted (core dumped)
答案 1 :(得分:1)
此代码导致未定义的行为,因为尝试访问数组外部的元素。有两种方法可以解决此问题:
block[X]
-X应该以固定大小定义。应将用户提供的值与X进行比较-然后确定,您不会跳出数组大小。block[X]
-使用用户提供的X动态创建数组(请检查malloc()函数)答案 2 :(得分:0)
在C数组中没有边界检查。您有一个int数组,它的宽度为5。如果您向数组中添加了五个以上未定义行为的元素,那么它不会止于五个元素。
用户有责任确保数组边界不超过分配的边界。