C语言 动态输入字符串
时间:2014-05-13 23:23:01
收藏:0
阅读:719
作者 :卿笃军
很多时候,我们不知道要开辟多大的空间,但是我们又想实现无限制的输入~~~
这时候,就需要用到动态空间的开辟了。
先简绍2个函数: malloc() , realloc()
函数名:malloc
原型:externvoid *malloc(unsigned int num_bytes);
功能:在堆中开辟num_bytes个字节的空间
函数名:realloc
原型:externvoid *realloc(void *mem_address, unsigned intnewsize);
参数:
mem_address : 需要追加空间的首地址
newsize : 需要将空间追加到多大(是指追加后总共的大小,不是指要追加的大小)
realloc()使用注意:
-
如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
-
如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。
实例:动态输入字符串
#include <stdio.h> #include <stdlib.h> int main() { char ch,*p = (char *)malloc(sizeof(char)); //预开辟一个空间 int count = 0; while ((ch = getchar()) != ‘\n‘) { p[count] = ch; ++count; //记录需要开辟空间数 p = (char *)realloc(p,(count+1)*sizeof(char));//开辟空间(realloc返回的地址不一定是原来的地址) } //所以这里最好用p[count],而不使用++p; p[count] = ‘\0‘; //注意尾部 puts(p); free(p); p = NULL; return 0; }
评论(0)