2017-06-22 500 views
0
const unsigned char* sqlite3_column_text(sqlite3 stmt*, int iCol); 

返回一个指向c字符串的指针,该字符串不应被修改。然而我做了这样的转换:sqlite3_column_text()类型转换

char* str = (char*)sqlite3_column_text(sqlite3 stmt*, int iCol); 

即使字符串被完全切断,也不会得到任何运行时问题。我仍然对const这件事感到有点紧张。为什么在那里?我可能遇到的任何问题?

回答

0

在当前版本的SQLite中,返回值碰巧指向缓冲区,该缓冲区对于游标行非常用,但不能保证实际上是这种情况,或者它将继续存在。

返回的值可能指向内存映射数据库文件本身,在这种情况下,您的修改会损坏它。或者库可能会实现一个共享字符串字典以节省内存,在这种情况下,您的修改会以相似的文本影响数据库中的所有行。或者缓冲区可能被MMU写保护,在这种情况下,您的代码试图写入它将崩溃。

在任何情况下,const清楚地表明您不允许修改返回的字符串,所以您甚至不应该尝试。