C语言 动态输入字符串

作者 :卿笃军


很多时候,我们不知道要开辟多大的空间,但是我们又想实现无限制的输入~~~

这时候,就需要用到动态空间的开辟了。

先简绍2个函数: malloc()  , realloc()

函数名:malloc

原型:externvoid *malloc(unsigned int num_bytes);

功能:在堆中开辟num_bytes个字节的空间

函数名:realloc

原型:externvoid *realloc(void *mem_address, unsigned intnewsize);

参数:

        mem_address  :  需要追加空间的首地址

        newsize            : 需要将空间追加到多大(是指追加后总共的大小,不是指要追加的大小)

realloc()使用注意:

  1. 如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。
    这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
  2. 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块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;
}


你可能感兴趣的:(C语言 动态输入字符串)