c语言动态内存
⑴ c语言动态内存的问题
不是哈,是释放那次申请的所有字节。
malloc向堆内存申请成功指定字节数时,系统内存管理程序会记录你这次申请的内存块大小的,释放它的时候你只需要提供首地址就行了,它自己知道是多少个字节。
⑵ C语言中动态内存分配函数的用法及作用(比如malloc,calloc,realloc等)
先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)
1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?
2。如果用动态分配,就解决上述问题了。当你需要多大内存时,就给你多大——如果有的话——这就是动态分配的意义。
现在看上述问题的代码,我调试过的:
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* calloc、exit需要声明头文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可对任意个整数排序;\n");
printf("请输入整数的总个数: ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); /* calloc函数的使用 */
if(p==0) {
printf("分配失败!\n");
exit(1); /* 当分配失败时,exit可以终止程序 */
}
printf("请输入这些整数:\n");
for(i=0;i<n;i++)
scanf("%d",p+i); /* 利用指针移位的方法赋值 */
for(i=1;i<n;i++) /* 冒泡排序法 */
{
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("将这些整数从小到大排列输出为:");
for(i=0;i<n;i++)
{
if(i%5==0) printf("\n"); /* 每隔5个数换行 */
printf(" %11d;",*(p+i));
/* 为了整齐,每个数占11个字符,当数字很多时这很重要 */
}
printf("\n");
free(p); /* 释放空间 */
}
----------------------------------------------------------------------
调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。
malloc、calloc、realloc的用法(以上述问题为例)及区别:
1。malloc(n*sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 */
2。calloc(n,sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0 */
3。realloc(p,sizeof(int)*n) /* 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候。个人觉得没用——不够就找到原分配处改大一点不就行了?! */
我能说得只有这些了,有些东西看起来麻烦,当你小试一下就会发现,不过如此嘛!学C要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……
希望我的回答对您有帮助!
⑶ c语言中什么是动态分配内存
c语言用函数malloc动态分配内存的,要用到指针,释放内存是free指针
malloc 原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
或#include<stdlib.h>
功能:用于向内存申请空间,分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
调用格式,
指针名=(指针所指对象的数据类型*)malloc(个数*sizeof(指针所指对象的数据类型)),其对应例子如下:
int *p = (int *) malloc ( n* sizeof(int) );
举例:
// malloc.c
#include <syslib.h>
#include <malloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
if(p)
free(p);
getchar();
return 0;
}
⑷ 如何用C语言编写动态分配内存的函数
#include<stdio.h>
voidmain()
{
int*p;
p=newint;
*p=3;
printf("%d ",*p);
deletep;
}
⑸ C语言动态开辟内存问题
k1=k2=(struct Student *) malloc (sizeof(struct Student)); //第一次输入
memset(k1,0,sizeof());
里面有没有字符数组的东西??先初始化一下吧.
别到时候你赋的时候有个东西没赋值,也没初始化,越界了.
另外,你的代码没贴全啊.这程序,你看起来是在fwrite的时候出的问题,但是,出问题的时候有可能是在你之前的一些操作导致的,就比如,输一个学生的名字,char name[15],但你名字输了20个,越界了,之类的,所以,建议把全代码贴下.
⑹ C语言动态内存问题
struct example eg[100]; // 使用数组,则已经在内存中分配了空间,就不再需要申请了。如果要动态分配内存,可以这样:
intn;//保存记录条数
scanf("%d",&n);
structexample*p=(structexample*)malloc(n*sizeof(structexample));
......
free(p);//释放动态内存
⑺ c语言什么时候需要动态分配内存
c语言什么时候需要动态分配内存?动态分配内存是什么意思?
在运行期,无法提前确定内存需要多少时,动态分配内存。
分配堆的内存,程序冗杂需要释放那么有什么意义?
释放多余的内存,就是把内存归还给系统管理,防止占用内存过多,造成系统内存不够、速度慢甚至崩溃。
动态分配的参数是表示分配指定大小还是指定不超过该数值大小做到精确?
动态分配需要指定大小,因为分配内存必须精准。
c语言线程问题?不动态分配有时引用数据类型的值被注销?不至于吧
使用局部变量,在超出作用域后变量会失效或者说注销
⑻ C语言中如何动态增加内存空间
动态增加内存空间 可以用 realloc 函数。函数原型是。
void* realloc (void* ptr, size_t size);
例如,你第一次用 malloc 函数 动态分配了空间,随着一步步运算,觉得空间不够,需要加大空间,与此同时,原先空间里的数据需保留并还要继续使用,这时需要用 realloc,它能满足此需要。
下面是完整的程序例子。告诉使用 realloc 的窍门。
#include <stdio.h> /* printf, scanf, puts */
#include <stdlib.h> /* realloc, free, exit, NULL */
int main ()
{
int input,n;
int count = 0;
int* numbers = NULL;
int* more_numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
more_numbers = (int*) realloc (numbers, count * sizeof(int));
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);
return 0;
}