读书人

内存有关问题。

发布时间: 2013-03-06 16:20:31 作者: rapoo

内存问题。。。


#include <stdio.h>
int main(void){
char a[1];
// char a[2];
scanf("%s",a);//这里我输入多个字符都可以,不会出现bug,why?
printf("%s\n",a);
}


以前我用VC++6.0,a[1]申请了一个字节的内存,但是可以接受4个字符并成功输出,但是a[2]却不能输入8个字符,

[解决办法]
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出,所写入的数据对别人来说是随机的,它也会产生不可预料的后果。

[解决办法]
引用:
C/C++ code?1234567#include <stdio.h>int main(void){ char a[1];// char a[2]; scanf("%s",a);//这里我输入多个字符都可以,不会出现bug,why? printf("%s\n",a);}

以前我用VC++6.0,a[1]申请了一个字节的内存,但是可以接受4个字符并……


1、“你申请了1一个字节的空间,却可以接受4个字符并输出”这种理解有问题,可能由于编译器 对齐的原因,在你申请一个字节的空间时,自动申请了4个字节的空间(编译器默认是4字节对齐的),所以这样你可以输入4个字符并输出,但是在你申请2个字节的时候,由于四字节对齐的缘故,依旧会给你分配4个字节的空间。
2、在写程序时,一般是你申请多少空间,就使用多少空间,最好或者禁止多使用。
[解决办法]
引用:
引用:C/C++ code?1234567#include <stdio.h>int main(void){ char a[1];// char a[2]; scanf("%s",a);//这里我输入多个字符都可以,不会出现bug,why? printf("%s\n",a);}

以前我用VC++6.0,a[1]申请了一个字……

LZ好好理解一下我回的那个有么有那么一点意义
然后你再试试下面这段程序,输入超个4个字符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *p = (char *)malloc(128);
char a[2];

scanf("%s",a); //多个字符都可以,不会出现bug,why?
printf("%s\n",a);
strcpy(p, "hello, world!");
printf("%s\n", p);
return 0;
}

[解决办法]
因为你是成年人,可以也必须为自己的行为负责

读书人网 >C语言

热点推荐