首先看个问题程序(这里用的是TC编译器) #include stdlibh #include stdioh void main() { int *i; i=(int *)malloc(sizeof(int)); *i=; *(i+)=; printf(%x|%d\ni*i); printf(%x|%di+*(i+)); } 输出的结果是 fc| fe| 这个程序编译通过运行正常说它有问题问题出在哪呢? 首先通过malloc建了一个大小为的堆 i指向的地址是fci+指向的地址是fc+sizeof(int)=fe 但是地址fe是不受保护的因为它不是机器分配给i+的随时会被其他变量占用 正确的做法是 #include stdlibh #include stdioh void main() { int *i; i=(int *)malloc(sizeof(int)); *i=; i=(int *)realloc(i*sizeof(int)); *(i+)=; printf(%x|%d\ni*i); printf(%x|%di+*(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)); 这个例子与上一个效果相同 |