C语言里一个Char变量不是只占一个字节么,为什么我在32机子上实验的时候一个char变量最多可以赋四个字母?

#include<stdio.h>intmain(){chars;scanf("%s",&s);printf("inputwordis:%s\n",&s);return0... #include <stdio.h>

int main()
{
char s;
scanf("%s",&s);
printf("input word is:%s\n",&s);

return 0;
}

代码如上,我一直以为s里应该只能放一个字母吧,可实验的时候发现最多可以放四个,比如输入aaaa,而程序一切正常,然后到5个字母的话程序就崩溃了。请问这是为什么呢。机子是32位的,是不是有什么关系。
展开
 我来答
匿名用户
2012-04-23
展开全部

输入 字符串的是候应该 定义 字符数组 数组名代表 首地址, 接收是用数组名  即:scanf("%s",s);  

而你程序里 scanf("%s",&s);  所以是可以接收的  

而 输出字符串的时候 是以 '\0'  为结束标记的 也是 , 输出字符串是 也是用 数组名 即:printf("%s",s);  

而你程序里 也给的是 地址  所以 是可以输出的

我在dev 里试的

云海鹰影
2012-04-23 · TA获得超过216个赞
知道小有建树答主
回答量:160
采纳率:83%
帮助的人:106万
展开全部
其实是只可以放1个的, 之所以能够放多个,是因为非法写入后续内存, 根据电脑的不同情况, 也不一定只能写4个, 也不一定能够写到4个~~
而之所以一般是可以写4个, 应该是因为地址对齐的原因吧, 32位默认4字节对齐, 在给s分配内存时,或者在s之后给系统中其他线程分配内存时,系统一般会按4个字节分配(也就是第一块申请的内存首地址和第二块内存首地址间隔是4个倍数), 所以你可以写入4个, 但是只有第一个是合法的, 后续内存没有被占用就不会崩溃,如果被占用了就崩溃了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jsfjsf25210
2012-04-23 · TA获得超过123个赞
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:140万
展开全部
原因是因为 指针是4个bit 你用了 & 就是取地址了

主要的原因是因为你用了取地址。用到了指针 。其他的都不是问题。 。。指针是4位的 这个才是重点。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
肯勇偃袒褂b6
2012-04-23
知道答主
回答量:45
采纳率:0%
帮助的人:23.3万
展开全部
输出时应该是%c不是%s,%s是输出字符串 ,还有输出时怎么会有取地址符&呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
styshoo1986
2012-04-23 · TA获得超过893个赞
知道小有建树答主
回答量:832
采纳率:100%
帮助的人:276万
展开全部
scanf("%s",&s);
printf("input word is:%s\n",&s);
改成
scanf("%c",&s);
printf("input word is:%c\n",s);

%s是字符串输出,%c才是字符。不同的。
追问
啊 明白了 
另外,这么看字符串也能放进字符变量里?而且这个时候一个字母只要两位就能表示了啊?
追答
printf("input word is:%s\n",&s);
这句话也就是在打印一个字符串。
你说的问题其实也牵扯到一个内存中存储的问题了,其实你已经越界了,字符只能存储一个字节的数据,你却输入一个字符串,那么之后的数据就存储在了s后面的位置了。
我改成如下代码
#include

int main()
{
char s;
char a = 'a';
scanf("%s",&s);
printf("input word is:%s, %c\n",&s, a);

return 0;
}
然后输入abcde,发现a的值被改成b了。理解了么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式