js333 > 计算机互联网 > 扩展堆数组的大小,C语言动态存储分配金沙js3

原标题:扩展堆数组的大小,C语言动态存储分配金沙js3

浏览次数:77 时间:2019-11-12

扩展堆数组的大小,扩展堆数组大小

函数:

void* realloc(void *ptr, size_t size);

功能: 函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。

 

扩展内存

 1 int main()
 2 {
 3     const size_t pSize = 15;
 4 
 5     char *p = new char[pSize]{0};
 6     strcpy_s(p, pSize, "I LOVE YOU");
 7 
 8     cout << "p:" << hex << (int)p << endl;
 9 
10     p = (char *)realloc(p, pSize * 2);
12 
13     if (!p)
14         cerr << "Call realloc function error!" << endl;
15 
16 
17     cout << "p1:" << hex << (int)p << endl;
18     _snprintf_s(p, pSize * 2, pSize * 2, "Hello,%s C++!", p);
19     cout << p<< endl;
20 
21     delete[]p;
22 
23     getchar();
24     return 0;
25 }

如果没有

p = (char *)realloc(p, pSize * 2);

这句代码,程序将在Call _snprintf_s function时崩溃,因为p指向的内存放不下那么多的数据。

这句代码的意思是在原有的内存上扩展内存。如果原有的内存上没有连续的pSize *2那么大的空闲内存,则重新分配内存,并把原内存上的数据copy到新内存
有了足够大的内存空间,那么Call _snprintf_s function时就不会发生溢出的情况了。


删除内存

 1 int main02()
 2 {
 3     const size_t pSize = 100;
 4     char *p = new char[pSize]{0};
 5     strcpy_s(p, pSize, "I LOVE YOU, Jia Yin!");
 6 
 7     // p = (char *)realloc(p, strlen(p) + 1);
 9     if (!p)
10         cerr << "Call realloc function error!" << endl;
11 
12     _snprintf_s(p, pSize, pSize, "%s..........", p);
13 
14     cout << p << endl;
15     delete[] p;
16 
17 
18     getchar();
19     return 0;
20 }

 p = (char *)realloc(p, strlen(p) + 1);     如果加了这一行代码,那么Call _snprintf_s function时就会崩溃。因为已经将多余的内存空间delete掉了,只留下strlen(p) + 1那么大的内存,装不下更多的数据。
这句代码的意思是,在原有内存的基础上把多余的内存delete掉,只留下strlen(p) + 1 这么多的内存

典型错误

 1 int main()
 2 {
 3     char array[10]{0};
 4     strcpy_s(array, 10, "Hello"); 7     // char *parray = (char *)realloc(array, 50);17     getchar();
18     return 0;
19 }

array在栈区,而realloc是在堆区分配内存。栈跟堆,永远也打不到一块去

 

函数: void*扩展堆数组的大小,C语言动态存储分配金沙js333娱乐场:。 realloc(void *ptr, size_t size); 功能: 函数将 ptr 对象的储存空间改变为给定的大小 size 。 参数...

释放存储

内存分配函数所获得的内存块都来自一个称为堆的存储池

p=malloc(...)
q=malloc(...)
p=q;

上面的代码使得p和q都指向同一块内存,导致出现内存泄露,使用free函数来释放不需要的内存,来回收垃圾

free函数在<stdlib.h>中有如下原型:

void free(void *ptr)

以上的代码改写如下:

p=malloc(...)
q=malloc(...)
free(p);
p=q;

 

 

C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的...

动态分配数组

使用malloc函数为数组分配存储空间,需要使用sizeof运算符来计算每个元素所需要的空间数量

int *a;
a=malloc(n * sizeof(int));

calloc函数

calloc函数在<stdlib.h>中具有如下的原型:

void calloc(size_t nmemb, size_t size);*

在分配了内存之后,calloc函数会通过对所有位设置为0的方式进行初始化

a=calloc(n, sizeof(int))

struct point{int x,y;}*p;
p=calloc(1,sizeof(struct point));

realloc函数

realloc函数可以调整数组的大小使它更适合需要,realloc函数原型在<stdlib.h>中:

void realloc(void *ptr, size_t size)*

ptr指向的内存块一定是先前通过malloc函数、calloc函数或realloc函数的调用获得的,size表示内存块的新尺寸

C语言标准列出几条关于realloc函数的规则:

  • 当扩展内存块时,realloc函数不会对添加进内存块的自己进行初始化
  • 如果realloc函数不能按照要求扩大内存块,那么它会返回空指针,并且在原有的内存块中的数据不会发生改变
  • 如果realloc函数调用时以空指针作为第一个实际参数,那么它的行为就像malloc函数一样
  • 如果realloc函数调用时以0作为第二个实际参数,那么它会释放掉内存块

动态存储分配

C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体

本文地址:

1、内存分配函数

3种内存分配函数都是声明在<stdlib.h>中:

  • malloc函数--分配内存块,但是不对内存块进行初始化
  • calloc函数--分配内存块,并且对内存块进行消除
  • realloc函数--调整先前分配的内存块

malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效

当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t

2、空指针

由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值:

p=malloc(10000);
if(p==NULL) {
    /*分配失败*/
}

在C语言中,指针测试真假的方法和数的测试一样:

if(p==NULL)
if(!p)
if(p!=NULL)
if(p)

举例如下:

typedef struct {
    long key;
    /*...*/
}Record;
float *myFunc(size_t n)
{
    double *dptr=malloc(sizeof(double));
    if(dptr==NULL)
    {
        /*...*/
        return NULL:
    }
    else
    {
        *dptr=0.07;
    }
    /*...*/
    Record *rptr;
    if(rptr=malloc(2*sizeof(Record))==NULL)
    {
        /*...*/
        return NULL;
    }
    float *fptr=malloc(n*sizeof(float));
    if(fptr==NULL)
    {
        /*...*/
        return NULL:
    }
    /*...*/
    return fptr;
}

本文由js333发布于计算机互联网,转载请注明出处:扩展堆数组的大小,C语言动态存储分配金沙js3

关键词:

上一篇:flower,flour

下一篇:没有了