2017-06-22 502 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清楚地表明您不允許修改返回的字符串,所以您甚至不應該嘗試。