| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:求教一个简单的关于字符数组的问题
只看楼主 加入收藏
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:5 
求教一个简单的关于字符数组的问题
程序代码:
#include <stdio.h>

int main ()
{
    char a[10], b[9], c[5];
    scanf("%s", a);
    scanf("%s", b);
    scanf("%s", c);
    printf("%s\n", b);
    printf("%s %s %s", a, b, c);

    return 0;
}

当输入到字符数组c[]中的字符个数大于5个是,字符数组b[]中的字符就会被c[]中溢出来的字符替换,不知原因,求教!
2015-08-24 16:57
w906414
Rank: 2
等 级:论坛游民
帖 子:75
专家分:76
注 册:2015-5-29
收藏
得分:0 
应该是输入流吧
2015-08-24 17:50
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
scanf应该用&吧

一片落叶掉进了回忆的流年。
2015-08-24 20:00
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
收藏
得分:0 
回复 3楼 诸葛欧阳
数组名是可以表示地址的
2015-08-24 20:24
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:20 
数组名不用&,没问题。
问题是楼主要理解编译器在栈里是如何给局部变量定义位置的。
1,栈是从高到低递减使用内存的
2,编译器预编译时会根据扫描到的变量顺序定义在当前栈指针的位置分配变量所需内存。
根据上述原则,假设当前栈指针位置为100,对你定义的变量举例如下(不考虑内存对齐):
1,变量定义顺序为char a[10], b[9], c[5];
2,编译器在栈中分配内存的方案为:数组a从内存90-99供10个字节,数组b从内存81-89共9个字节,数组c从76-80共5个字节。
3,按你描述的数组c输入时涨破,由于scanf函数输入不做溢出检查,所以多出的字符会顺序往后存储,加入你输入8个字符'a',超出数组宽度3个,字符在内存中的表示如下:
内存位置: 76   77   78   79   80   81   82   83   84
内存数据:'a'  'a'  'a'  'a'  'a'  'a'  'a'  'a'  '\0'
很显然,内存81-84是数组b的部分内存,此时你printf("%s",b),则会显示“aaa",是数组c的后3个字符了。数组涨破后出现这个情况的原理就这样。

能编个毛线衣吗?
2015-08-24 21:06
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
收藏
得分:0 
回复 5楼 wmf2014
茅塞顿开,自己不太理解数据在内存中的存储方法,非常感谢!
2015-08-24 21:17
快速回复:求教一个简单的关于字符数组的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017770 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved