新手一枚,零零碎碎学习了一些东西,不过一直也没有写博客的习惯。觉得在空闲时间还是应该抽时间写一写记一记,这样有对于自己进行总结,同时也能做一个参考。好了,闲话就不多说了,直接进入我的第一篇博客正文。
在学习C语言的时候,我们经常会遇到数组。更多的时候我们处理的数组都是固定长度的,或者说我们处理的数组长度都是已知的。但是有时候我们会遇到数组长度不明确的情况,如用数组保存用户从键盘输入一系列数字,直到用户输入数字0输出提示内容并退出输入。C语言处理动态数组在应用中是不可避免的,下面介绍在C语言里处理动态数组的常用方法。(当然用java或者C++都是很容易解决的)。
应用背景: 用户由键盘输入一系列数字,当输入数字0时输出提示信息:input breakout,并退出输入。
IDE: VS2013
本方法主要使用malloc和memcpy以及realloc函数来处理动态数组,以10作为一个基 准,当用户超过10,当用户输入数组的个数是n(n>10),就开始用malloc申请内存,新开辟的内存由用户指定,例如:当用户输入20个数字的时候还没出现数字0 ,此时新开辟的内存大小可以是pow(2,20/10)*4bytes,或者也可以是(2*20/10)*4bytes。内存大小的开辟比较灵活,可以根据用户的实际情况而定。
malloc()原型:void *malloc(unsigned int num_bytes);
realloc()原型: void *realloc(void *mem_address, unsigned int newsize);
memcpy()原型:void *memcpy(void *dest, const void *src, size_t n);
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define SIZE_int 10
void main()
{
int data[10];
int *p, *pt;
p = data;
p = (int *)malloc(4 * SIZE_int);
int capacity = SIZE_int;
int n=0;
printf("please input the data until the input data is zero :\n");
for (int i = 0; i < 100; i++)//预判输入的数字个数不会超过100个
{
scanf_s("%d", p + i);
n = i / capacity;
if (*(p + i) == 0)
{
printf("input breakout :\n");
free(p);
free(pt);
pt = NULL;
p = NULL;
break;//退出输入
}
if ((*(p + i) != 0) && (n >= 1))
{
pt = (int*)realloc(p, pow(2, n)*capacity);
memcpy(pt, p, 4 * sizeof(i));
}
}
system("pause");
}