在c:中为全局变量和局部变量分配的内存是不同的

时间:2014-06-23 16:56:20

标签: c memory-management struct global-variables local-variables

enter image description here The code for output is shown in scren shot..please correct me if i am wrong(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但不是更多。我不知道为什么,但它发生了???

3 个答案:

答案 0 :(得分:2)

在这两种情况下输入字符串超过10 char s(包括\0)将调用未定义的行为,因为您正在写入数组绑定(已分配)内存)。
在这种情况下,说第一个工作,第二个不超过10 char s是没有意义的。可以看到任何预期或意外的行为。

答案 1 :(得分:1)

C不对数组访问进行边界检查,因此如果写入数组的末尾,它不会自动引发异常。写过数组末尾的行为是 undefined ;编译器不需要以任何特定方式处理该错误。 非常智能的编译器可能会发出诊断和暂停转换。或者它可以编译代码,好像什么都没有(这是通常的行为)。运行时,您的代码可能会立即崩溃,或者它可能继续运行在一个糟糕的状态并在以后崩溃(之前曾在该电影中运行;不好玩),或者它可能会继续运行而没有任何问题。

C语言假设您知道阵列的大小,并且您足够聪明,不会在其边界之外徘徊。它不会阻止你这样做,但在那一点上它并没有对你的程序的行为做出任何保证。

答案 2 :(得分:0)

当您向10写入超过name个字符时,您正在踩到未经授权的内存。

在全局命名空间中定义n时,您正在破坏某些内存位置,但在您的特定情况中,不会立即看到不良副作用。由于行为未定义,对于不同的用例,您可能会立即或以延迟的方式看到不良副作用。

在函数中定义n时,您正在破坏本地堆栈内存,并且您的特定情况会立即显示不良副作用。