知识大全 程序编译之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

相关参考