读书人

C数组有关问题

发布时间: 2013-10-24 18:27:24 作者: rapoo

C数组问题
一段很简单的程序:
#include <stdio.h>
main()
{
char name[3];
puts("Input your name:");
scanf("%s",name);
printf("%s",name);
}

编译后运行:
$ ./numbergroup.exe
Input your name:
fengyunsen
fengyunsen

突然觉得好奇怪,明明定义了char name[3],我输入的字符串都超过3个了,但是怎么没有报错?
后面我还测试了一下:
#include <stdio.h>
main()
{
char name[3];
printf("%s",name);
puts("Input your name:");
scanf("%s",name);
printf("%s",name);
if (name[9] == 'n')
{
printf("\nTrue!");
}
}
运行结果:
$ ./numbergroup.exe
Input your name:
fengyunsen
fengyunsen
True!

这下有点迷糊了,这个char name[3] 到底有没有限制的?请教各路大神 c
[解决办法]
char name[3];
这个数组是线性存储的 它会随机找零散的线性内存区域 满足你的name[3]空间
如果name[4]后面的内存区域没与人在用 或者不是系统保护的地方 你是可以访问到的
但不代表你的程序每次运行都可以访问到 有可能会出段错误

比如你输入100多个j 你看看 必会出段错误
[解决办法]

引用:
那是不是以后码代码应该避免这样的情况,或者如果非要这样用必须要做出判断?

是的我告诉你如何判断 成为高手
#include<assert.h>

assert(0 <= idx && idx < sizeof(a) /sizeof(a[0]));
a[idx] 就是安全的
调试好程序后加上#DEBUG
这样可以自动避免 等写好程序在都去掉assert

读书人网 >C语言

热点推荐