c语言以内存分配笔记

先看一个数组:数组

short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其他后面默认会给值为0;函数

或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组大小只有2个。指针

数组名array实际上是指向的数组的首地址,好比咱们能够经过array[1]取出数组的第二个元素,也能够经过指针*(array+1)指向第二个元素取出对应的值。code

看完上面数组定义,能够看出数组是必须固定大小的,并且不能够再扩展的特性。blog

假设一个场景,咱们想要往一段内存里写入一堆的int类型的数据,可是大小是不知道的。若是使用数组这儿就不适用了。内存

还好咱们c语言有个函数malloc 和 calloc和realloc函数。可使用好比:扩展

short* array请求

array = (short*)malloc( sizeof(int)*30);im

//这儿首先开辟了30个int类型的空间,而后把p指向这个空间的位置。在这里的指针是指向第一个int值。并非咱们所有开辟的30个int的空间。这就和数组同样,指向数组的指针式指向数组首元素的地址,并非整个数组的元素。因此,在这里咱们的操做也和数组是同样的。call

若是咱们要实现动态内存拓展的方式,咱们可使用calloc和realloc。

接下来,咱们在认识两个关于内存分配的函数。calloc()函数和realloc()函数。 
calloc()函数与malloc()函数有相同之处,也有类似之处。 
例:

short *p;
newmem=(short *)calloc(1000,sizeof(short));

经过这个例子,咱们能够知道calloc()函数有两个参数,而且这两个函数都是size_t类型(unsigned int类型)的数。第一个参数在这里所说的是所须要开辟的内存的单元数量,第二个参数是每一个单元的字节的大小。

void *calloc(size_t ,size_t);

calloc()函数还有一个特性,它将块中的所有位都置为0。这也是calloc()函数和malloc()函数的区别,calloc()函数和malloc()函数的另一个区别是他们请求内存数量的方式不同。固然,free()函数也能够来释放calloc()函数分配的内存。

realloc()函数用来修改一个原先已经分配的内存的大小。使用这个函数,你可让一块内存增大仍是缩小。当扩大时,这块内存原先的内容会依然保留,新增长的添加到原先的后面。缩小时,该内存的尾部部份内存去掉,剩余保留。

注意:对于realloc()函数,若是原先的内存没法修改,这时候realloc()函数再会分配一块内存,而且把原先那块内存的内容复制到上面去。因此,使用了realloc函数之后,你这时候在使用的就该是realloc函数返回的新指针了。当realloc函数的第一个参数是NULL时,这时候咱们能够把它看成是malloc()函数。

咱们来个例子:

void printChars(){

    int *strs = malloc(sizeof(int)* 255); //使用动态分配内存  建立int类型返回数组
    for (int i = 0; i < 255; i++){
        *(strs+i ) = i + 1; 
    }
    int M = 100; //动态大小
    int *p;
    p = (int*)malloc(sizeof(int)*M);
    int N = 1;
    for (int i = 0; i < 255; i++){
        if (i % 100 == 0 && i!=0){ //达到极限的时候,再次动态扩充整数倍布内存
            p = realloc(p, sizeof(int)*M*(++N));

        }
        *(p + i) = *(strs+i);
    }
    for (int j = 0; j < 255; j++){
        printf("%d " , *(p + j));
    }

}

打印结果:

相关文章
相关标签/搜索