缓冲区溢出的问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓冲区溢出的问题?相关的知识,希望对你有一定的参考价值。

程序如下:
#define N 2
#include <iostream>
using namespace std;

class Student

public:
Student(void);
~Student(void);
int GetNum() return num;
void SetScore();
void PrintScore();
private:
int num;
float score[5];
;

Student::Student(void)



Student::~Student(void)



void Student::SetScore()

for(int i=0;i<5;i++)
cin>>score[i];


void Student::PrintScore()

for(int i=0;i<5;i++)
cout<<score[i]<<'\t';
cout<<endl;


int main()

Student student[N];
int i,j;
char course[5][10];
cout<<"请输入课程名称:";
for(j=0;j<5;j++)
cin>>course[j];

for(i=1;i<=N;i++)

cout<<"请输入第"<<i<<"位学生的成绩:"<<endl;
student[i].SetScore();

cout<<"==========学生成绩表==========="<<endl;
for(j=0;j<5;j++)
cout<<course[j]<<'\t';
cout<<endl;

for(i=1;i<=N;i++)
student[i].PrintScore();
return 0;


在输入了5门课程以及2位学生的各科成绩后,按Enter后出现Windows出错和关闭信息。用调试运行,显示错误:在已损坏了程序内部状态的 StudentScore.exe 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。
请问这是什么原因?

参考技术A N=2,Student student[N],这时只有student[0]和student[1]两个数组元素,而
for(i=1;i<=N;i++)

cout<<"请输入第"<<i<<"位学生的成绩:"<<endl;
student[i].SetScore();

里i是从1开始算得就会出现student[2],当然会溢出了.本回答被提问者采纳
参考技术B N=2,Student
student[N],这时只有student[0]和student[1]两个数组元素,而
for(i=1;i<=N;i++)

cout<<"请输入第"<<i<<"位学生的成绩:"<<endl;
student[i].SetScore();

里i是从1开始算得就会出现student[2],当然会溢出了.

堆栈缓冲区溢出会导致堆损坏吗?

【中文标题】堆栈缓冲区溢出会导致堆损坏吗?【英文标题】:Can stack buffer overflows cause heap corruption? 【发布时间】:2014-03-29 18:48:00 【问题描述】:

堆栈缓冲区溢出是否可能导致堆损坏问题而不会溢出返回地址?如果有,你能举个例子吗?

【问题讨论】:

哪种语言?哪个平台? 【参考方案1】:

是否会导致堆损坏很大程度上取决于平台。

但是,例如,缓冲区溢出会覆盖指针变量,以便它获得一个恰好是不同但有效指针的新值。如果代码然后继续释放所述指针(不知道它现在是别的东西),那么引用该指针的代码可能会崩溃或行为异常,因为内存已被过早释放并可能重新分配用于不同的目的。

【讨论】:

很好的答案!谢谢! 我见过这样的情况,当this指针从保留调用的寄存器溢出到堆栈,然后堆栈被覆盖。

以上是关于缓冲区溢出的问题?的主要内容,如果未能解决你的问题,请参考以下文章

什么是C语言缓冲区溢出漏洞?怎么利用?谁可以提供详细的资料

缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]

c++缓冲区溢出问题

McAfee提示“缓冲区溢出”,该怎么处理?

怎么解决 LINUX 堆栈溢出内存的问题

多图详解缓冲区溢出问题