malloc()函数怎么体现动态分配内存?已经分配好的内存,要往里面再加数据,内存空间会自动调大吗?

2024-11-28 18:59:56
推荐回答(4个)
回答(1):

已经分配好的内存,要往里面再加数据,内存空间会自动调大。

  动态内存分配,可以自由的分配指定大小的内存空间。当程序运行时,程序员并不清楚某一数据需要的具体内存空间大小时,可以使用动态分配。
  malloc函数原型
  void *malloc(int nSize)
  分配一个nSize大小的内存空间,如果分配成功则返回地址空间的首地址,如果分配失败则返货NULL
  nSize一般使用 sizeof(类型A)*N 的计算方式获取大小。意思为:为分配n个类型A所占空间的大小。
  获取的指针地址需要强制转换为指定类型
例如:int *p = (int*)malloc(sizeof(int)*100);
  使用malloc动态分配的内存空间需要使用free函数手动释放。

回答(2):

malloc 动态分配内存, 分配好的内存空间不会自动调大。
但可以用 realloc 调整大小。可以调大,也可以调小。
要求 malloc, realloc 后,系统真实分给的空间大小可以用 _msize() 返回。
有的编译器用 msize()返回.

例如:
#include#include
#include

int main(){
char *str;
str = (char *) malloc(16); // 要求分配 16字节 strcpy(str, "123456789012345");
printf("String = %s -- true memory size=%d\n", str,_msize(str));
/* Reallocating memory */ str = (char *) realloc(str,24); // 重新要求 分配24字节
strcpy(&str[15], "abcde");
printf("String = %s -- true memory size= %d\n", str,_msize(str));
free(str); return(0);
}

回答(3):

比如要分配n个int型数据空间:
int *p = ( int* ) malloc ( n * ( sizeof( int ) ) ) ;
也就是分配了 n * sizeof(int) 个字节的内存,并且让int型指针 p 指向首地址
这是你可以使用这些内存,注意这些内存空间是连续的,可以像数组一样使用 p[i]=13
跟数组一样,访问越界了就会产生非法访问的错误,编译时不检查,
跟数组不一样,数组声明时长度必须是常量,动态分配却可以是变量,
用玩后要释放掉,用free(p) ,这时p必须是指向首地址
你的疑问:内存分配是动态的,也就是可以用变量控制的,如果想要想matlab那样自动调大,当然可以,不过你有两种方法:自己写代码,或找别人的代码,c语言没有提供这类函数,而c++里面有标准容器,其中的vector就是自动调整的
不知能不能解答你的疑问,呵呵,如果要彻底弄明白,先学学C语言吧

回答(4):

malloc本身不能体现自动调整类的动态分配内存,它只能实现在程序运行时决定的内存尺寸的申请,比如你打开不同的图象时,对于不同尺寸的图象要临时决定申请多大内存。这种动态申请是相对于事先由程序告诉编译器要申请多大尺寸的数组这类情况的,在这个意义上,malloc申请的内存是在程序运行时才申请而不是事先申请好的,所以叫“动态”。
在malloc申请好的内存中添加数据不会使系统自动调整相关内存尺寸,除非你设计程序来调整,比如发现数据量超出预先定义尺寸则重新申请一块大些的内存,并将原来的数据存放过来,再释放原先malloc的内存;这些操作类似于realloc函数的功能。如果再想复杂和智能只能编程序实现了。