免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10342 | 回复: 24
打印 上一主题 下一主题

[C]void指针赋值后,地址值发生了变化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-27 17:17 |只看该作者 |倒序浏览
void* queue_new(uint32_t size) {
        queue *q = NULL;
        q = (queue*)malloc(sizeof(queue));
        passert(q);
        q->head = NULL;
        q->tail = &(q->head);
        q->elements = 0;
        q->size = 0;
        q->maxsize = size;
        q->freewaiting = 0;
        q->fullwaiting = 0;
        if (size) {
                eassert(pthread_cond_init(&(q->waitfull),NULL)==0);
        }
        eassert(pthread_cond_init(&(q->waitfree),NULL)==0);
        eassert(pthread_mutex_init(&(q->lock),NULL)==0);
        fprintf(stderr,"queue address is %p\n",q);
        return (void*)q;
}

static void *myqueue;
fprintf(stderr, "queue address: %p\n",my queue);
myqueue = (void *)queue_new(0);        
fprintf(stderr, "queue address: %p\n", myqueue);


运行显示:
queue address: (nil)
queue address is 0x2aaab0008680
queue address: 0xffffffffb0008680

调用函数后,指针值由0x2aaab0008680改为0xffffffffb0008680。
请问什么问题导致的呢?

论坛徽章:
0
2 [报告]
发表于 2011-09-27 17:45 |只看该作者
你函数返回然后赋值给指针,不就是想改变指针的值嘛

现在指针值改变了你又问为什么?

论坛徽章:
0
3 [报告]
发表于 2011-09-27 18:00 |只看该作者
回复 2# 雨过白鹭洲

请仔细看一下,我说的是在函数调用的末尾打印的地址和赋值的地址不一致。

论坛徽章:
0
4 [报告]
发表于 2011-09-27 18:04 |只看该作者
函数内部malloc调用返回的地址经过一次赋值后地址值发生了变化,最终导致了段错误。

论坛徽章:
0
5 [报告]
发表于 2011-09-27 18:34 |只看该作者
回复 4# nbaloverme
有没有可能 queue *  和 void *两种指针大小不同
是否测试一下两者的sizeof

论坛徽章:
0
6 [报告]
发表于 2011-09-27 23:06 |只看该作者
回复 5# KBTiller


    应该不是,不是每次运行都出现错误,随机发生。

论坛徽章:
0
7 [报告]
发表于 2011-09-27 23:22 |只看该作者
fprintf(stderr,"queue address is %p\n",q);
return (void*)q;

只有一种可能,这两个语句之间函数栈被破坏了。
导致q中存的地址值被改变了

论坛徽章:
0
8 [报告]
发表于 2011-09-28 08:20 |只看该作者
回复 6# nbaloverme


    如果sizeof不同,也会产生随机的结果,测试一下sizeof应该不费劲。能排除的可能最好先都排除掉
    如果不是这个原因,在
        q = (queue*)malloc(sizeof(queue));
    后面加一句
        fprintf(stderr,"queue address is %p\n",q);
    不知道是什么结果

论坛徽章:
0
9 [报告]
发表于 2011-09-28 09:37 |只看该作者
回复 8# KBTiller


    测试环境为x86_64。测试结果:
    sizeof queue*: 8, sizeof void*: 8

论坛徽章:
0
10 [报告]
发表于 2011-09-28 09:41 |只看该作者
另补充一下,有多个线程在调用queue_new这个函数,会不会是malloc的可重入问题导致的呢,希望有人能探讨一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP