
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位的,是不是有什么关系。 展开
int main()
{
char s;
scanf("%s",&s);
printf("input word is:%s\n",&s);
return 0;
}
代码如上,我一直以为s里应该只能放一个字母吧,可实验的时候发现最多可以放四个,比如输入aaaa,而程序一切正常,然后到5个字母的话程序就崩溃了。请问这是为什么呢。机子是32位的,是不是有什么关系。 展开
5个回答
2012-04-23
展开全部
其实是只可以放1个的, 之所以能够放多个,是因为非法写入后续内存, 根据电脑的不同情况, 也不一定只能写4个, 也不一定能够写到4个~~
而之所以一般是可以写4个, 应该是因为地址对齐的原因吧, 32位默认4字节对齐, 在给s分配内存时,或者在s之后给系统中其他线程分配内存时,系统一般会按4个字节分配(也就是第一块申请的内存首地址和第二块内存首地址间隔是4个倍数), 所以你可以写入4个, 但是只有第一个是合法的, 后续内存没有被占用就不会崩溃,如果被占用了就崩溃了
而之所以一般是可以写4个, 应该是因为地址对齐的原因吧, 32位默认4字节对齐, 在给s分配内存时,或者在s之后给系统中其他线程分配内存时,系统一般会按4个字节分配(也就是第一块申请的内存首地址和第二块内存首地址间隔是4个倍数), 所以你可以写入4个, 但是只有第一个是合法的, 后续内存没有被占用就不会崩溃,如果被占用了就崩溃了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
原因是因为 指针是4个bit 你用了 & 就是取地址了
主要的原因是因为你用了取地址。用到了指针 。其他的都不是问题。 。。指针是4位的 这个才是重点。
主要的原因是因为你用了取地址。用到了指针 。其他的都不是问题。 。。指针是4位的 这个才是重点。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
输出时应该是%c不是%s,%s是输出字符串 ,还有输出时怎么会有取地址符&呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
改成
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了。理解了么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询