首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C语言的内存管理(2)

C语言的内存管理(2)

以下是一个简单的c文件,环境是OS--Linux,ARCH--PPC
##sta.c###
#include <stdio.h>

int kk[100] = {1,2,3,4,5};
int tt[100];
int ii;

int main()
{
int i;
static int si;
char a[10]= "abcd";
printf("i is %d/n");
return 0;
}

经过gcc -S sta.c之后,生成的汇编代码如下
##sta.s###

        .file   "sta.c"
        .gnu_attribute 4, 2
        .gnu_attribute 8, 3
        .globl kk
        .section        ".data"
        .align 2
        .type   kk, @object
        .size   kk, 400
kk:
        .long   1
        .long   2
        .long   3
        .long   4
        .long   5
        .zero   380
        .lcomm  si.2254,4,4
        .type   si.2254, @object
        .section        .rodata
        .align 2
.LC1:
        .string "i is %d/n"
        .align 2
.LC0:
        .string "abcd"
        .zero   5
        .section        ".text"
        .align 2
        .globl main
        .type   main, @function
main:
        stwu 1,-32(1)
        mflr 0
        stw 0,36(1)
        stw 31,28(1)
        mr 31,1
        lis 9,.LC0@ha
        la 9,.LC0@l(9)
        lwz 0,0(9)
        lbz 9,4(9)
        stw 0,12(31)
        stb 9,16(31)
        li 0,0
        stb 0,17(31)
        li 0,0
        stb 0,18(31)
        li 0,0
        stb 0,19(31)
        li 0,0
        stb 0,20(31)
        li 0,0
        stb 0,21(31)
        lis 9,.LC1@ha
        la 3,.LC1@l(9)
        crxor 6,6,6
        bl printf
        li 0,0
        mr 3,0
        lwz 11,0(1)
        lwz 0,4(11)
        mtlr 0
        lwz 31,-4(11)
        mr 1,11
        blr
        .size   main, .-main
        .comm   tt,400,4
        .comm   ii,4,4
        .ident  "GCC: (GNU) 4.2.3"
        .section        .note.GNU-stack,"",@progbits

Note: 一般编译器和操作系统实现来说,对于虚拟地址空间的最低(从0开始的几K)的一段空间是未被映射的,也就是说它在进程空间中,但没有赋予物理地址,不能被访问。这也就是对空指针的访问会导致crash的原因,因为空指针的地址是0。至于为什么预留的不是一个字节而是几K,是因为内存是分页的,至少要一页;另外几k的空间还可以用来捕捉使用空指针的情况。
继承事业,薪火相传
返回列表