首页
社区
课程
招聘
[旧帖] [讨论]动态内存每次申请的地址都是一样的,这是为什么? 0.00雪花
发表于: 2011-12-25 16:42 1362

[旧帖] [讨论]动态内存每次申请的地址都是一样的,这是为什么? 0.00雪花

2011-12-25 16:42
1362
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *blood = (int*) malloc( sizeof(int));
    *blood = 100;

    printf( "%d\n", *blood );
    printf( "\n%d", blood );

    free(blood);
    return 0;
}

这个是局部变量,为什么申请的地址都是一样的呢?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 217
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
每次运行的地址?不一样啊
100
162140168

100
161984520
2011-12-25 17:07
0
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
奇怪了,为什么在我的电脑上,申请的都是一样的
2011-12-29 18:02
0
雪    币: 434
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
难道说 这个就是传说中的巧了!
2011-12-29 18:39
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个感觉可以参考潘爱民老师的一本书。。《Windows内核原理与实现》,讲WRK的。

然后说Windows的内存分配分了几个步骤。

不过我有一个方法确定你可以每次产生不同的地址。

在vista之后,Windows都默认开了ASLR地址随机化功能,就是每次开机的时候在系统范围内确定几个基地址,每次启动时地址一般不同。

因此在vista以及其他的NT6.0以后的系统中,你只需要重启,每次就得到不同的地址了。

再说了,你的进程独享一个平坦地址空间,每次分配同一个内存地址不是一个自然的事情么。。

分配的地址还包含随机因素那反而神了。
2011-12-29 19:42
0
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我试验了一下。把程序放到桌面和放到E盘运行。分配的地址都是不一样的。但每次运行申请的地址都是一样的。没办法 ,只有改成下面程序了。用随机数打乱

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
    int hit;
    srand(GetTickCount());

    int i;
    for( i=rand(); i != 0; i-- )
        malloc(4);

    int *blood = (int*) malloc( sizeof(int));
    *blood = 100;
    printf( "当前血量:\n%d", *blood );

    while(1)
    {
        printf( "\n输入攻击数值:");
        scanf( "%d",&hit );
        printf( "当前血量:\n%d", *blood -= hit );
    }

    free(blood);
    return 0;
}
2011-12-30 10:24
0
游客
登录 | 注册 方可回帖
返回
//