指针地址为什么会变成0x00000002?

happyboy16 2010-01-01 01:15:21
我的程序中用到一个结构体:
struct map_dir{
int num;
struct key_node *node;
}map_dir_point;

调试时出现错误,查看变量发现map_dir_point->node是0x00000002,这个感觉很奇怪,我程序要么使用malloc,分配一个key_node结构给map_dir_point->node,要么map_dir_point->node=NULL;
为什么map_dir_point->node会出现等于0x00000002的情况?请大侠们解答下,谢谢!
...全文
273 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
happyboy16 2010-01-01
  • 打赏
  • 举报
回复
问题的出现都比较有规律
ssd->map_page_dir[mp_lpn].node->head=0x00000001都是连续出现,一般是两个或者多个连续的,例如:
ssd->map_page_dir[408].node->head
ssd->map_page_dir[409].node->head
而且ssd->map_page_dir[mp_lpn].node->num为1或者2,表示,ssd->map_page_dir[408].node生成过一个或者两个search_qt_node类型的结构体
happyboy16 2010-01-01
  • 打赏
  • 举报
回复
我见有种说法是,对于删除节点,需要先free再赋值为NULL,在我的程序中是先赋值为NULL,再free的,这里是否有问题?
happyboy16 2010-01-01
  • 打赏
  • 举报
回复
struct search_qt_node{ //用在快速查找在同一个mp_lpn的快表节点
struct qt_entry *entry_node; //指向快表节点的指针
struct search_qt_node *next_node; //指向下一个search_qt_node
};


struct mp_lpn_node{ //每个mp_lpn都有一个这个节点,用于在写回映射关系时,快速查找到在同一个mp_lpn的lpn。当新的qt_entry加到qt时,在相应mp_lpn中增加指针,写回的时候,回收所有同一mp_lpn的指针
struct search_qt_node *head;
struct search_qt_node *tail;
unsigned int num;
};
以上是程序中用到的两个结构体
head和tail都是指向search_qt_node类型的结构体,刚开始时,生成一个search_qt_node的节点,head和tail都指向这个节点。后面有新的内容要增加时,生成一个新的search_qt_node节点,增加到最后一个节点的后面,使tail指向这个节点,最后一个search_qt_node节点的next_node一直保持为NULL

[Quote=引用 13 楼 haozi8993 的回复:]
增加节点有问题吧
C/C++ codeif(ssd->map_page_dir[mp_lpn].node->head==NULL)
{
ssd->map_page_dir[mp_lpn].node->head=(struct search_qt_node*)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
ssd->map_page_dir[mp_lpn].node->head->entry_node=entry;
ssd->map_page_dir[mp_lpn].node->head->next_node=NULL;//向后为NULL,不知怎么连起来的 ssd->map_page_dir[mp_lpn].node->tail=ssd->map_page_dir[mp_lpn].node->head;
}else
{
sqnp=(struct search_qt_node*)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
sqnp->entry_node=entry;
sqnp->next_node=NULL;//向后为NULL,不知怎么连起来的 ssd->map_page_dir[mp_lpn].node->tail->next_node=sqnp;
ssd->map_page_dir[mp_lpn].node->tail=sqnp;
}

[/Quote]
罗耗子 2010-01-01
  • 打赏
  • 举报
回复
增加节点有问题吧
if(ssd->map_page_dir[mp_lpn].node->head==NULL) 
{
ssd->map_page_dir[mp_lpn].node->head=(struct search_qt_node *)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
ssd->map_page_dir[mp_lpn].node->head->entry_node=entry;
ssd->map_page_dir[mp_lpn].node->head->next_node=NULL; //向后为NULL,不知怎么连起来的
ssd->map_page_dir[mp_lpn].node->tail=ssd->map_page_dir[mp_lpn].node->head;
}
else
{
sqnp=(struct search_qt_node *)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
sqnp->entry_node=entry;
sqnp->next_node=NULL; //向后为NULL,不知怎么连起来的
ssd->map_page_dir[mp_lpn].node->tail->next_node=sqnp;
ssd->map_page_dir[mp_lpn].node->tail=sqnp;
}

happyboy16 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kingstarer 的回复:]
map_dir_point->node 似乎不符合语法
[/Quote]
恩,不好意思,应该是map_dir_point.node,我发帖时简化了代码,简化时写错了,呵呵
我的代码中是先NULL,再free的。
happyboy16 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 z569362161 的回复:]
越界最好是把代码多发点。

大家能看到,帮你分析啊
[/Quote]
以下是生成节点的代码
if(ssd->map_page_dir[mp_lpn].node->head==NULL)
{
ssd->map_page_dir[mp_lpn].node->head=(struct search_qt_node *)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
ssd->map_page_dir[mp_lpn].node->head->entry_node=entry;
ssd->map_page_dir[mp_lpn].node->head->next_node=NULL;
ssd->map_page_dir[mp_lpn].node->tail=ssd->map_page_dir[mp_lpn].node->head;
}
else
{
sqnp=(struct search_qt_node *)malloc(sizeof(struct search_qt_node));
ssd->map_page_dir[mp_lpn].node->num++;
sqnp->entry_node=entry;
sqnp->next_node=NULL;
ssd->map_page_dir[mp_lpn].node->tail->next_node=sqnp;
ssd->map_page_dir[mp_lpn].node->tail=sqnp;
}

以下是删除节点的代码:
node=ssd->map_page_dir[mp_lpn].node->head;
ssd->map_page_dir[mp_lpn].node->head=NULL;
ssd->map_page_dir[mp_lpn].node->tail=NULL;
ssd->map_page_dir[mp_lpn].node->num=0;
while(node!=NULL)
{
sqnp=node->next_node;
free(node);
node=sqnp;
}

谢谢
caoshuming_500 2010-01-01
  • 打赏
  • 举报
回复
map_dir_point->node 好像不合法, map_dir_point.node
菜鸟,学习中...
用户 昵称 2010-01-01
  • 打赏
  • 举报
回复
就是非法访问了。
kingstarer 2010-01-01
  • 打赏
  • 举报
回复
map_dir_point->node 似乎不符合语法
z569362161 2010-01-01
  • 打赏
  • 举报
回复
越界最好是把代码多发点。

大家能看到,帮你分析啊
cattycat 2010-01-01
  • 打赏
  • 举报
回复
被修改或者未初始化。
东大坡居士 2010-01-01
  • 打赏
  • 举报
回复
0x00000002这个应该是操作系统使用的地址
Contemplating 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 happyboy16 的回复:]
我见有种说法是,对于删除节点,需要先free再赋值为NULL,在我的程序中是先赋值为NULL,再free的,这里是否有问题?
[/Quote]

最佳实践就是:
free(ptr);
ptr = NULL

反过来的做法是错误的。尽管编译不会出错,运行时候的错误隐藏就会很深了。

在C++中 delete 0; delete NULL;这样的写法也是正确的(即delete空指针),但是也是啥也不做。
traceless 2010-01-01
  • 打赏
  • 举报
回复
很有可能是在加入结点的那几步
  • 打赏
  • 举报
回复
肯定间接修改过,或者有未malloc的。
happyboy16 2010-01-01
  • 打赏
  • 举报
回复
我该怎样查找和定位这个越界访问的问题呢?谢谢!
mstlq 2010-01-01
  • 打赏
  • 举报
回复
可能是某些数组越界访问,不经意间修改了某个map——dir的node域……

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧