字符串指针和字符数组的诡异问题

背景:QT编程,dateTimeEdit是一个QCombobox下拉菜单控件,从中读取事件日期转换为char 类型,eventLogMessage.shartDateTime是char * 类型。

这是最原始的实现方法:

QDateTime dd = ui->dateTimeEdit->dateTime();

QString tt = dd.toString("yyyy-MM-dd hh:mm:ss");
QByteArray aa =tt.toLatin1();

eventLogMessage.shartDateTime=aa.data(); 


第一种修改方法:做一个函数实现,函数输入参数为ui->dateTimeEdit->dateTime(),返回值为aa.data(); 

char *dvr_eventlog::dateTimeToChar(QDateTime dateTime)
{
char *re;
QString str=dateTime.toString("yyyy-MM-dd hh:mm:ss");
QByteArray ba=str.toLatin1();
re=ba.data();
return re;
}

主函数调用处:

eventLogMessage.shartDateTime=dateTimeToChar(ui->dateTimeEdit->dateTime());

结果是:printf打印验证结果是对的,但是后面这个时间数据用于SQLite数据检索读出的时候就有问题了。


第二种修改方法:做一个无返回值的函数,使用参数传出方式返回aa.data(); 值

void dvr_eventlog::dateTimeToChar(QDateTime dateTime,char *tmp)
{

QString str=dateTime.toString("yyyy-MM-dd hh:mm:ss");
QByteArray ba=str.toLatin1();
strcpy(tmp,ba.data());
}

主函数调用处:

char tmp[50];

dateTimeToChar(ui->dateTimeEdit->dateTime(),tmp);
eventLogMessage.shartDateTime=tmp;

结果是:printf打印的结果与前两种方式完全相同strlen长度也相同,但这样就可以检索出来(与之前相同的日期时间,格式也相同)


第三种修改方法:还是做一个无返回值得函数,使用两级指针返回字符串

void dvr_eventlog::dateTimeToChar(QDateTime dateTime,char **tmp)
{
QString str=dateTime.toString("yyyy-MM-dd hh:mm:ss");
QByteArray ba=str.toLatin1();
*tmp=ba.data();
}

主函数调用处:

char *tmp;

dateTimeToChar(ui->dateTimeEdit->dateTime(),&tmp);
eventLogMessage.shartDateTime=tmp;

疑问:这样做有问题吗?


最终结果:采用方式二

你可能感兴趣的:(cc++)