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

#include <stdio.h>

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

return 0;
}

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

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

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

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

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

我在dev 里试的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-23
其实是只可以放1个的, 之所以能够放多个,是因为非法写入后续内存, 根据电脑的不同情况, 也不一定只能写4个, 也不一定能够写到4个~~
而之所以一般是可以写4个, 应该是因为地址对齐的原因吧, 32位默认4字节对齐, 在给s分配内存时,或者在s之后给系统中其他线程分配内存时,系统一般会按4个字节分配(也就是第一块申请的内存首地址和第二块内存首地址间隔是4个倍数), 所以你可以写入4个, 但是只有第一个是合法的, 后续内存没有被占用就不会崩溃,如果被占用了就崩溃了
第2个回答  2012-04-23
原因是因为 指针是4个bit 你用了 & 就是取地址了

主要的原因是因为你用了取地址。用到了指针 。其他的都不是问题。 。。指针是4位的 这个才是重点。
第3个回答  2012-04-23
输出时应该是%c不是%s,%s是输出字符串 ,还有输出时怎么会有取地址符&呢?
第4个回答  2012-04-23
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了。理解了么?

相似回答