(CHAR ARRAY的全球声明)
#include<stdio.h>
char name[10]; /* though allocated memory is 10 bytes still it accepts more then 10 chars*/
void main()
{
printf("\n ENter name :\t");
scanf("%s",name);
}
第二种情况:( CHAR数组的本地声明)
#include<stdio.h>
void main()
{
char name[10];/* Now it will only accepts 10 chars NOT MORE */
printf("\n ENter name :\t");
scanf("%s",name);
}
为什么在第一种情况下接受字符的差异接受超过10但在第二次正好10但不是更多。我不知道为什么,但它发生了???
答案 0 :(得分:2)
在这两种情况下输入字符串超过10
char
s(包括\0
)将调用未定义的行为,因为您正在写入数组绑定(已分配)内存)。
在这种情况下,说第一个工作,第二个不超过10
char
s是没有意义的。可以看到任何预期或意外的行为。
答案 1 :(得分:1)
C不对数组访问进行边界检查,因此如果写入数组的末尾,它不会自动引发异常。写过数组末尾的行为是 undefined ;编译器不需要以任何特定方式处理该错误。 非常智能的编译器可能会发出诊断和暂停转换。或者它可以编译代码,好像什么都没有(这是通常的行为)。运行时,您的代码可能会立即崩溃,或者它可能继续运行在一个糟糕的状态并在以后崩溃(之前曾在该电影中运行;不好玩),或者它可能会继续运行而没有任何问题。
C语言假设您知道阵列的大小,并且您足够聪明,不会在其边界之外徘徊。它不会阻止你这样做,但在那一点上它并没有对你的程序的行为做出任何保证。
答案 2 :(得分:0)
当您向10
写入超过name
个字符时,您正在踩到未经授权的内存。
在全局命名空间中定义n
时,您正在破坏某些内存位置,但在您的特定情况中,不会立即看到不良副作用。由于行为未定义,对于不同的用例,您可能会立即或以延迟的方式看到不良副作用。
在函数中定义n
时,您正在破坏本地堆栈内存,并且您的特定情况会立即显示不良副作用。