android - 使用随机值预初始化的静态变量
问题描述
有人可以解释为什么char m_DBFileName[257]
静态变量 (g_JournalDB) 的成员变量 () 会被随机值初始化吗?我希望它用'\ 0'填充。
更多信息:g_JournalDB 是在应用启动时加载的动态库的一部分,通过
public class MyApplication extends Application {
static {
System.loadLibrary("mylibrary");
...
System.loadLibrary("mylibraryN");
}
@override
public void onCreate() {...}
...
}
上面的屏幕截图取自 MyApplication 的 onCreate() 中的断点,其中 g_JournalDB 被创建。如果需要,我可以提供更多信息。
编辑:是否有可能,因为我正在加载多个 .so 文件,一个或多个 .so 文件有重叠的内存映射?
EDIT2:在 cAMPDatabase 的类构造函数中,我这样做memset(m_DBFileName, 0, sizeof(m_DBFileName))
我真的希望它填充有 '\0'。
UPDATE1:稍后在应用程序中,我尝试更新g_JournalDB.m_DBFileName
,我发现我无法再访问前 20 个索引。当我执行 astrncpy(m_DBFileName, "/data", 256);
时,新值从索引 20 开始。如下所示,我的字符串“/data”从索引 20 开始。
UPDATE2:我能够确定问题是由内存错误引起的:
09-07 07:57:11.417 309-309/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
09-07 07:57:11.417 309-309/? I/DEBUG: Build fingerprint: 'qcom/msm7808/msm7808:5.1.1/WMY57L/ittech01220402:userdebug/release-keys'
09-07 07:57:11.417 309-309/? I/DEBUG: Revision: '0'
09-07 07:57:11.417 309-309/? I/DEBUG: ABI: 'arm'
09-07 07:57:11.417 309-309/? I/DEBUG: pid: 22437, tid: 22437, name: zapplication.zapp >>> com.zapplication.zapp <<<
09-07 07:57:11.418 309-309/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x69e793d8
09-07 07:57:11.433 309-309/? I/DEBUG: r0 0056a27c r1 69e371ac r2 0004222c r3 a0bcab7c
09-07 07:57:11.433 309-309/? I/DEBUG: r4 ffffffff r5 a0e29428 r6 be876678 r7 be876618
09-07 07:57:11.433 309-309/? I/DEBUG: r8 be897ab0 r9 b7a7f1c8 sl be897a40 fp b7a7f1c8
09-07 07:57:11.434 309-309/? I/DEBUG: ip a09df2f8 sp be876600 lr a094afa9 pc a094afd8 cpsr 300f0030
09-07 07:57:11.434 309-309/? I/DEBUG: backtrace:
09-07 07:57:11.434 309-309/? I/DEBUG: #00 pc 0001bfd8 /data/app/com.zapplication.zapp-1/lib/arm/libmylibrary.so (_ZN12cAMPDatabase11CreateTableEPKcP18DB_DATA_DEFINITION+79)
UPDATE3:对于那些询问的人,这里是 cAMPDatabase 类构造函数:
cAMPDatabase::cAMPDatabase() {
m_DBHandle = NULL;
memset(m_DBFileName, 0, sizeof(m_DBFileName));
memset(m_Tables, 0, sizeof(m_Tables));
m_TblCount=0;
this->m_SqlObj = this->NewStmt();
}
这是该类的标头定义(此处为完整定义):
class cAMPDatabase {
friend class cAMPSqlStmt;
public:
cAMPDatabase();
virtual ~cAMPDatabase();
// the rest of public variables and functions here ...
protected:
char m_DBFileName[257];
// the rest of protected variables and functions here ...
}
解决方案
你试过m_DBFileName
asstd::string
代替char *
orarray
吗?
请尝试分享一个用于静态变量初始化的最小可重现示例。
推荐阅读
- flutter - 选中时如何更改raisedButton的颜色
- python - 如何从地理标记语言文件创建 NetworkX 图?
- oop - OOP 和 ORM 的区别
- javascript - 如何在 JSON 字符串化操作期间保留重复值
- openstreetmap - 有没有办法从 OpenStreetMap 中提取公共 gpc 示踪剂?
- amazon-web-services - 如何找出 MSK(托管 kafka)在哪个 EC2 实例上运行?
- python - PayPal:是否可以仅通过订单 ID/详细信息为订单付款
- django - 无法在 Django App 中加载环境变量 (.env)
- jenkins - 如何在 Jenkins 管道中使用 SSH 密钥对通过 SSH 连接到服务器?
- php - DocuSign - 多用户/合同的最佳选择