c语言的怪问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 18:00:18
#include "stdio.h"
void main()
{
char *s;
int i=0;
s=(char*)malloc(sizeof(char));
gets(s);

while(s[i]!='\0')
{
if(s[i]!='z'&&s[i]!='Z')
s[i]+=1;
else s[i]-=25;
i++;
}
puts(s);
}
上述代码问题是:
当输入一比较短的字符串时没有问题,当输入较长的字符串时就崩溃了???为啥啊?????

首先呢,我的运行没有问题,输入了几十个字符也可以,但是即使这样是有问题的程序

s只分配了一个字符的空间,虽然这样也能接受多个字符,但是这是由于c编译器检查不严格的问题,多于的字符被存放在了未知的内存上,但是这些内存有可能以后被分配给其他的变量,或者被其他程序所改写,或者这些多出来的字符会改写其他变量或者程序所占用的空间,就会引起崩溃等问题

就是说你的情况恰好就是这样,你只给s分配了一个字符的空间,那么多出来的字符就有可能写在了一个别的程序已经占用的内存上,那么由于在保护模式下,这些内存不能够被改写,就会出现严重错误了

解决办法就是多分配些空间出来就好了,比如
s=(char*)malloc(sizeof(char)*100);

你在给指针s申请内存的时候,只申请了一个字节的空间.如果改成
s=(char*)malloc(1000 * sizeof(char));比如这样,申请1000个字节的空间的话,程序肯定不会崩溃.至于你说输入较短的时候没问题,那纯属偶然现象.

你只分配了一个字节,而想输入许多字符,可能吗?
sizeof(char)等于1