标签归档:缓冲区

linux c 存储器的越界引用和缓冲区溢出

在c语言程序编写中,对数组的引用不进行任何边界检查,而且局部变量和状态信息都存放在栈中。

********

这两种情况结合到一起可能会导致严重的错误发生,一个越界的数组元素的写操作破坏了存储在栈中的状态信息,当程序使用这个被破坏的状态,试图重新加载数据,就会出现严重的错误。
/*定义gets 函数*/
char *gets(char *t){
int i;
char *t1 = t;
while((i=getchar()) !=’\n’ && i !=EOF)
*t1++ =i;
*t1++ =’\0′;
if(i == EOF)
return NULL;
return t;
}

void echo(){
char t[3];
gets(t);
puts(t);
}

在gets函数中 可以无限制的读入,当遇到 \n 或错误(未读到字符)时终止,puts 是标准输出, gets函数无法限制读入字符串的大小, 当程序运行的时候,可以看出系统为数组分配两个地址存储字符串,当读入的字符串大于两个地址的时候,c语言将向程序的其它区域写入了错误的信息,导致莫名奇妙的错误,这就是缓冲区溢出所导致的严重错误。