locate函数测试

locate函数测试

源代码:

#include 
#include 
#include 

static void show_pointer(void *p, char *descr) {
    //    printf("Pointer for %s at %p\n", descr, p);
    printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p);
}

char big_array[1L<<24];    /*  16 MB */
//char huge_array[1L<<31];   /*   2 GB */
char huge_array[1L<<30];/*   1 GB */
int global = 0;

int useless() { return 0; }

int main ()
{
    void *p1, *p2, *p3, *p4;
    int local = 0;
    p1 = malloc(1L << 28);
    p2 = malloc(1L << 8);
    //p3 = malloc(1L << 32);
	p3 = malloc(1L << 16);
    p4 = malloc(1L << 8);

    show_pointer((void *) big_array, "big array");
    show_pointer((void *) huge_array, "huge array");
    show_pointer((void *) &local, "local");
    show_pointer((void *) &global, "global");
    show_pointer((void *) p1, "p1");
    show_pointer((void *) p2, "p2");
    show_pointer((void *) p3, "p3");
    show_pointer((void *) p4, "p4");
    show_pointer((void *) useless, "useless");
    show_pointer((void *) exit, "exit");
    show_pointer((void *) malloc, "malloc");
    return 0;
}

/*
gec@ubuntu:/mnt/hgfs/share/csapp_code$ gcc locate.c
gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out
big array	0x4804a060	1208262752
huge array	0x804a060	134520928
local	0xbfcc9fdc	3217858524
global	0x804a044	134520900
p1	0xa7545008	2807320584
p2	0x49a67008	1235644424
p3	0x49a67110	1235644688
p4	0x49a77118	1235710232
useless	0x80484b6	134513846
exit	0x8048370	134513520
malloc	0x8048350	134513488

*/

测试结果
locate函数测试_第1张图片
学习心得
这个程序就是开辟一些空间,然后以16进制和10进制打印出首地址。

引用
1.malloc函数

函数原型为void malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。

2.calloc 函数

函数原型为void *calloc(unsigned int num, unsigned int size)

按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为 numsize。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

3. realloc函数:

函数原型为void *realloc(void *ptr, unsigned int size)

  重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size
  为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与
  以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16
  个字节。

**动态申请的内存空间要进行手动用free()函数释放

你可能感兴趣的:(计算机系统基础)