2023-7-2 【工作记录】
问题代码块:
char *itoa(int n)
{
char ch[5];
sprintf(ch,"[%d]",n);
return ch;
}
报 错:返回的地址是局部地址
原 因:这是内存分配的问题,ch定义在函数体中,是一个局部变量,其内存空间位于栈(stack)中的某个位置,作用范围也仅限于这个循环函数中,每当循环结束一次,调用栈中的内容将被收回,若想返回ch的内容是不可能的,因此会报错
解决方案:将函数定义为char *itoa(int n, char *retbuf),且retbuf的空间由调用者申请和释放,itoa()只是将转换结果存放到retbuf而已
问题代码块:
for(int i=0;i<10;i++)
{
char ch[5];
sprintf(ch,"[%d]",n);
cout<<ch<<endl;
}
报 错:free():invalid pointer 核心已转储
原 因:sprintf函数与printf函数一样,按照format格式参数化序列。但他会将输出的结果放到ch[]这个数组中,而不是输出到标准输出中。因此,需将ch[]预设足够大存放输出结果。
解决方案:将ch[]预设的足够大