晚上就结贴,字符串赋值问题

master5470 2005-01-13 04:57:31
lude <stdio.h>
void main()
{
char ary[5];
printf("\n Enter string : ");
scanf("%s",ary);
printf("\n The string is [%s] \n\n", ary);
}
输入值 显示结果
yang [yang]
yangz [yangz]
yangzhi [yangzhi]
以上都不会报错
但是
yangzhiwe [yangzhiwe]
同时报错:
“0x0040128c”指令引用的“0x00120049”内存,该内存不能为“written”。

有一个小细节:输入的字符串长度一旦超过(5-1)*2就会报错,其中5为ary[5]的大小

高手们指点下!




...全文
607 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
24607660 2005-02-23
  • 打赏
  • 举报
回复
天龙和 paranoid_gre(冲和淡泊( babe, how are u )) 的理解是正确的,这是由 padding(填充)造成的,不止数组的内存分配是这样, 自定义结构、对象的分配都可能有padding发生。
定义一个结构,用sizeof(...)应该就可以看到。
polarman 2005-01-14
  • 打赏
  • 举报
回复
默认的内存对齐是8字节,因此超过(5-1)*2 (=8)就会出错
应该是声明char str[n]; 当输入超过n + (8-n%8)时就会报这个该内存不能为“written”的错误
其实在输入超过4个字节(4个字符加一个'\0')就已经错误了,只是后面的几个字节还有写权限,所以不会报错
bingbing1981 2005-01-14
  • 打赏
  • 举报
回复
我也很纳闷
chinaamber 2005-01-14
  • 打赏
  • 举报
回复
是不是用的VC2003的集成环境。是不是和C#一样一个字符也可以装下汉字。如果是这样就是存储的编码的事情了。这个问题很明显就是越界了。
pcyy 2005-01-14
  • 打赏
  • 举报
回复
char ary[5];只能装4个字符
长度>4的时候,就不对了


同意
rayoko 2005-01-14
  • 打赏
  • 举报
回复
对于越界的问题,会产生的问题会因编译器的不同而不同,要想明白为什么会产生这种结果,还是要研究透彻compiler才行吧.
paranoid_gre 2005-01-14
  • 打赏
  • 举报
回复
可能是程序的padding(填充)引起的,为了使cpu的吞吐达到最大,一般数据都是按照字长的整数倍被存贮和操作的。在一般的32位的机器上(也就是字长是4个字节的),sizeof(char) = 1个字节,char ary[5];应该被padding了3个字节在后面,凑成了8个字节。(5-1)*2 = 8 正好是巧合,char ary[5]
~ char ary[8]都是8个字节会报错吧。
gaoxianfeng 2005-01-14
  • 打赏
  • 举报
回复
void main()
{
char ary[5];
printf("\n Enter string : ");
scanf("%s",ary);
printf("\n The string is [%s] \n\n", ary);
}
改成
void main()
{
char ary[5];
int i;
printf("\n Enter string : ");
scanf("%s",ary);
i=0;
printf("\n The string is [%s] \n\n", ary);
printf("ary addr is %lu, i addr is %lu \r\n", ary, &i);
}
asddfg 2005-01-14
  • 打赏
  • 举报
回复
估计多输入了几个字符,修改了字符数组的结束标志
当程序退出时,要释放内存,这样就要多释放些空间,操作系统肯定不让了,所以要报错

diaosan 2005-01-14
  • 打赏
  • 举报
回复
同意
liweiiewil(阿笨2003)
有可能就是分配内存时的问题。。。
不过,我也是菜鸟
wu_ricks 2005-01-14
  • 打赏
  • 举报
回复
大家都很精辟
master5470 2005-01-14
  • 打赏
  • 举报
回复
多谢大家的参与,认识到了些许细节!
satanxj 2005-01-14
  • 打赏
  • 举报
回复
我在VC6.0 Release版中发现:
char arr[?];
sacf("%s",arr);
数组大小?:出错输入
1: 1
2: 12
3: 1234
4: 1234
5: 12345678
6: 12345678
7: 12345678
8: 12345678
9:123456789012
10:123456789012
11:123456789012
非常奇怪,数组较大的时候似乎是按4的整数倍分配的,但是较小(1,2的情况下)时就不一样。
我认为,DEBUG和RELEASE中,分配数组大小的时候,都是按照4的整数倍进行的。但是,编译器进行了优化,所以1,2的情况很特殊。建议大家取消优化选项进行一下测试,我今天没空了 ^_^
Kshape 2005-01-14
  • 打赏
  • 举报
回复
char ary[5];只能装4个字符
=================================
原因可能是:
当超过了5个,当然就发生内存溢出了
访问非法地址
北京的雾霾天 2005-01-14
  • 打赏
  • 举报
回复
要保证程序运行健壮,只能按正常的方式来访问程序,不能有一些侥幸的心理啊.
xxxsunzk 2005-01-14
  • 打赏
  • 举报
回复
越界是访问未知的内存
结果不可知
oldrealman 2005-01-14
  • 打赏
  • 举报
回复
to master5470(真的很黑)
具体我也不是很清楚!
但是vc6.0的环境中都是4字节对齐的!
具体前面有一篇文章《问:在VC6环境下为什么定义一个变量(也包括数组、结构变量等),其地址总是4的倍数》,你可以看看那里面的说明!也可以自己测试测试!
一些人说是由于intel的mmu决定的,说arm等中就不是了,我没有过arm,没有测试过!不是很清楚!
llmsn 2005-01-14
  • 打赏
  • 举报
回复
你的数组越界了,大于5个字符就没定义了.尽量使用vector和valarray而不是内部(C风格)的数组.
wu_ricks 2005-01-14
  • 打赏
  • 举报
回复
up
master5470 2005-01-14
  • 打赏
  • 举报
回复
to oldrealman(天龙) 和操作系统有关系吗?依据是什么?
加载更多回复(19)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧