在我的main函数中用c ++代码检测到堆栈粉碎... 这是主体:
int main()
{
long int acn;
char dot[15];
float open_balance=1;
char k;
int total_account=0;
int c;
static int ac=10000;
TRANSACTION trn;
support sprt;
do{
cout<<"\n1.New account\n2. Transaction\n3. Exit\n\nEnter choice:";
cin>>k;
switch(k) {
case '1':
ac+=1;
time_t rawtime;
time(&rawtime);
strcpy(dot,ctime(&rawtime));
do{
if(open_balance<=0)
cout<<"Opening BALANCE can not be less than zero";
cout<<"\nEnter the opening balance :";
cin>>open_balance;
}while(open_balance<=0);
bln[total_account].get_data(ac,open_balance,dot);
++total_account;
break;
case '2':
trn.trans(total_account);
break;
case '3': break;
default :
cout<<"\nWrong choice!!";
}
}while(k!='3');
cout<<"Thank you";
return(0);
}
当我通过valgrind运行代码时,它也发现堆栈粉碎但找不到任何内存泄漏。 valgrind报告:
1.新帐号 2.交易 3.退出
输入选项:3 *堆栈粉碎检测* :./ a.out终止谢谢== 9813 ==
== 9813 == HEAP SUMMARY:
== 9813 ==在退出时使用:0块中的0字节
== 9813 ==总堆使用量:10个分配,10个释放,954个字节分配
== 9813 ==
== 9813 ==所有堆块都被释放 - 没有泄漏可能
== 9813 ==
== 9813 ==对于检测到的和抑制的错误计数,请重新运行:-v
== 9813 ==错误摘要:0个上下文中的0个错误(抑制:0从0开始)中止(核心转储)
我哪里错了?
答案 0 :(得分:1)
这是导致堆栈混乱的行strcpy(dot,ctime(&rawtime));
。
function ctime
返回一个字符串"Wed Jun 30 21:49:08 1993\n"
,其长度超过15个字节,你需要更多的字节存储ctime
的结果。
strcpy
不检查目标记忆的边距,因此被认为是危险的,建议使用替代strncpy
。而且,如果您的程序运行多个线程,则首选ctime_r
。