源代码:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> 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 */测试结果 学习心得 这个程序就是开辟一些空间,然后以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()函数释放