假设以下代码:
static const value_string global_variable [] = {
{ 4, "STRING1" },
{ 6, "STRING2" },
{ 9, "STRING3" },
{ 10, "STRING4" },
{ 11, "STRING5" },
{ 12, "STRING6" },
{ 13, "STRING7" },
{ 14, "STRING8" },
{ 15, "STRING9" },
};
const gchar * try_val_to_str_idx(const guint32 val, const value_string *vs, gint *idx)
{
gint i = 0;
DISSECTOR_ASSERT(idx != NULL);
if(vs) {
while (vs[i].strptr) {
if (vs[i].value == val) {
*idx = i;
return(vs[i].strptr);
}
i++;
}
}
*idx = -1;
return NULL;
}
其中vs
是一个静态const数组(global_variable),具有两个元素的结构:
一个int
和一个指向char
的指针。
此代码是wireshark源代码的摘录。因此,此函数假定vs是一个静态const变量。
我的问题是,我可以假设访问静态const数组的出站索引(我猜想存储在.DATA段上)是有效的吗?访问的内存是否有效?或者是未定义的行为?
例如,如果我尝试找到相对于值40的字符串会发生什么?
如果它有效,我怎么能确定,内存的位置将有0值,然后是NULL
并退出while循环?
答案 0 :(得分:3)
我可以假设访问静态const数组的出站索引(我猜想存储在.DATA段上)是有效的吗?
访问超出内存 始终 undefined behaviour。甚至不尝试这样做。