关于c语言的问题

当我定义“chara[2]"时编译器会给数组多少内存空间??为什么我运行以下代码时可以正常输入并输出3个字符??#include<stdio.h>voidmain(){c... 当我定义“char a[2]"时
编译器会给数组多少内存空间??
为什么我运行以下代码时可以正常输入并输出3个字符??
#include <stdio.h>
void main()
{
char a[2];
scanf ("%s",a);
printf ("%s\n",a);
}
而当括号内改成5时,就可以正常输入7个数!!
为什么??
系统究竟给数组分配多少内存空间??
注:我是用vc 2005 express edition
展开
 我来答
楠公小白L
2006-12-09 · TA获得超过525个赞
知道小有建树答主
回答量:362
采纳率:0%
帮助的人:413万
展开全部
当然是2个。不过实际上比较复杂。
原则上来说,对象的定义语句会对该对象分配这个对象所需的存储。然而对数组来说,主要有两个问题:
第一,C语言中对数组的支持相当不完整,它只不过是对一组连续存储的对象进行访问的语法简化。就是说,如下语法形式是等价的。
arr[i] == i[arr] == *(arr+i);
数组名就是数组首地址,而不会进行任何下标访问限制,并且作为函数参数传递的必然是这个地址。
scanf函数获得了这个地址,并试图向这个地址上写入数据,它并不知道这个地址上的数组到底有多大,你输入多少都会被写进去,用%s所写的字符串还要加上一个'\0'字符。
所以你写3个字符实际上是4个字符,而7个字符实际上是8个字符。
第二,自动变量是在运行栈上分配空间的,如果你向超过数组下标范围的地方写入数据,几乎可以肯定会造成在该运行栈上分配的其他自动变量的改动甚至是破坏整个运行栈结构。数据输入多了自然会造成程序崩溃。这是非常常见的C语言“缓冲区溢出”安全问题的主要原理。
第三,内存中分配变量有时不是紧挨着放置的,这其中有关于“对齐”的要求。
所谓对齐问题,简单的说就是按2的指数倍的内存位置进行放置。由于CPU在读写内存时要通过数据总线,而数据总线是4字节或8字节等,而每个读写指令肯定最自然的方式就是一次读写4个字节或8个字节。为了提高CPU访问内存的效率,防止对一个变量需要进行两次读取或写入才能完成访问,通常在分配其内存位置时都把它放在按2、4或8个字节对齐的位置。这种情况下,
char a[2];
会在运行栈上分配2个字节,而按32位机器的对其要求还有2个字节的填充空余,总共是4个字节,而
char a[5];
的填充就会是3个字节。由此可以推断你可以输入3个获7个数字是因为额外的字符和'\0'被放在这些填充位置上。再多就会破坏栈结构了。
baihacker
2006-12-09 · TA获得超过1454个赞
知道小有建树答主
回答量:773
采纳率:100%
帮助的人:1219万
展开全部
4的整数倍个字节
补充说明:
a[2]分配了4个字节,也就是说可以输入3个字节并正常显示
因为, 字符串要求最后一个是'\0\',所以能正常输入3个字符!
同理a[5]分配了八个字节,能正常输入7个字节的字符

但是如果内存没有分配的时候如果是0的话,那么
a[2]输入四个字符的话,分配的内存外是0,所以也能正常显示
如果输入5个字符就是在分配的内存外写东西了,错误!

你可以直接理解为能输入字符长度的为分配的空间长度减1.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0a9ebac
2006-12-09 · TA获得超过813个赞
知道小有建树答主
回答量:1360
采纳率:0%
帮助的人:1226万
展开全部
好象是1b吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式