知识大全 程序编译之mallocandrealloc
Posted 地址
篇首语:少年意气强不羁,虎胁插翼白日飞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 程序编译之mallocandrealloc相关的知识,希望对你有一定的参考价值。
首先看个问题程序(这里用的是TC编译器) #include stdlib h #include stdio h void main() int *i; i=(int *)malloc(sizeof(int)); *i= ; *(i+ )= ; printf( %x|%d\\n i *i); printf( %x|%d i+ *(i+ )); 输出的结果是 fc| fe| 这个程序编译通过 运行正常 说它有问题 问题出在哪呢? 首先通过malloc 建了一个大小为 的堆 i指向的地址是 fc i+ 指向的地址是 fc+sizeof(int)= fe 但是地址 fe是不受保护的 因为它不是机器分配给i+ 的 随时会被其他变量占用 正确的做法是 #include stdlib h #include stdio h void main() int *i; i=(int *)malloc(sizeof(int)); *i= ; i=(int *)realloc(i *sizeof(int)); *(i+ )= ; printf( %x|%d\\n i *i); printf( %x|%d i+ *(i+ )); realloc 可以对给定的指针所指的空间进行扩大或者缩小 无论是扩张或是缩小 原有内存的中内容将保持不变 当然 对于缩小 则被缩小的那一部分的内容会丢失 realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址 相反 realloc 返回的指针很可能指向一个新的地址 所以 在代码中 我们必须将realloc返回的值 重新赋值给 p : p = (int *) realloc (p sizeof(int) * ); 甚至 你可以传一个空指针( )给 realloc 则此时realloc 作用完全相当于malloc int* p = (int *) realloc ( sizeof(int) * ); //分配一个全新的内存空间 这一行 作用完全等同于 int* p = (int *) malloc(sizeof(int) * ); 『附注 TC编译器里sizeof(int)= VC里面sizeof(int)= char型在两个编译器里是一样的 都是 个字节( 位)』 calloc与malloc相似 参数nelem为申请地址的单位元素长度 elsize为元素个数 如: char* p; p=(char*)calloc(sizeof(char) ); 这个例子与上一个效果相同 cha138/Article/program/SQL/201311/11184相关参考