读书人

这样为什么不行?解决方案

发布时间: 2012-06-14 16:00:31 作者: rapoo

这样为什么不行?

C/C++ code
#include <stdio.h>int main(void){    char a[5];    int i;    for(i = 0; i < 5; i++)    {        scanf("%d",a[i]);    }    for(i = 0; i < 5; i++)    {        printf("%d",a[i]);    }    return 0;}

运行时,输入数据就报内存错误,是怎么回事

[解决办法]
scanf("%d",a[i]);

要从scanf格式化的实现原理来讲,你一错就错了两个地方:

1,&a[i],传入地址才能被scanf填充内存
2,scanf("%c", &a[i]),你使用%d,那么scanf将访问&a[i]地址开始的4个字节当做int进行赋值,当循环到i=2的时候就内存越界操作了。
[解决办法]
探讨
C/C++ code
#include <stdio.h>
int main(void)
{
char a[5];
int i;
for(i = 0; i < 5; i++)
{
scanf("%d",a[i]);
}
for(i = 0; i < 5; i++)
{
printf("%d",a[i]);
……

[解决办法]
C/C++ code
#include <stdio.h>int main(void){    char a[2];    int i;    gets(a);    for(i = 0; i < 1; i++)    {        printf("%s",&a[i]);//Be Careful。    }    return 0;}
[解决办法]
探讨

C/C++ code
#include <stdio.h>
int main(void)
{
char a[2];
int i;
gets(a);
for(i = 0; i < 1; i++)
{
printf("%s",a[i]);
}

return 0;
}

这个程序为什么运行后,输入数据也会出现内存错误?

[解决办法]
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

读书人网 >C语言

热点推荐