究竟需要给Malloc函数分配多少内存才算合适呢?
2005-06-21 20:09
501 查看
下面是一个用指针操作链表的程序,网上的例子.觉得不错.很典型.先拿它来开刀.
#include <iostream>
#include "stdafx.h"
using namespace std;
struct listNode
{
long data;
struct listNode *nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;
LISTNODEPTR list(LISTNODEPTR , int); // 此处不同
void printlist(LISTNODEPTR);
void freelist(LISTNODEPTR); // 增加
void _tmain(int argc, _TCHAR* argv[])
{
LISTNODEPTR newPtr=NULL;
int i,a;
for(i=0;i<3;i++){
printf("please enter a number/n");
scanf("%d,",&a);
newPtr = list(newPtr,a); // 此处注意
}
printlist(newPtr);
freelist(newPtr); // 此处
return 0;
}
LISTNODEPTR list(LISTNODEPTR sPtr, int a)
{
if ( sPtr != NULL )
sPtr->nextPtr = list( sPtr->nextPtr, a ); // 递归,向后面的节点上加数据。
else
{
sPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE)); // 注意,是节点的尺寸,类型转换,关于这里,发现了点问题.
sPtr->nextPtr = NULL;
sPtr->data = a;
}
return sPtr;
}
void freelist(LISTNODEPTR sPtr )
{
if ( sPtr != NULL )
{
freelist( sPtr->nextPtr ); // 递归, 先释放后面的节点
free( sPtr ); // 再释放本节点
}
else //
return ; // 此两行可不要
}
void printlist(LISTNODEPTR currentPtr)
{
if(currentPtr==NULL)
printf("The list is empty/n");
else
{
printf("This list is :/n");
while(currentPtr!=NULL)
{
printf("%d-->",cu
4000
rrentPtr->data);
currentPtr=currentPtr->nextPtr; // 这里不一样
}
printf("NULL/n/n");
}
}
在那里,代码简化为:
LISTNODEPTR sPtr;
sPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE));
sPtr明明是一个指向listNode结构的指针,为什么不分配给它一个指针大小的内存呢?像这样:
sPtr=(LISTNODEPTR)malloc(sizeof(LISTNODEPTR)); //同时,把释放内存函数改成如下:
void freelist(LISTNODEPTR sPtr )
{
if ( sPtr != NULL )
{
freelist( sPtr->nextPtr ); // 递归, 先释放后面的节点
}
else
free( sPtr ); // 再释放本节点
return;
}
如果不改释放内存函数,程序在释放内存时出错.什么原因呢?
#include <iostream>
#include "stdafx.h"
using namespace std;
struct listNode
{
long data;
struct listNode *nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;
LISTNODEPTR list(LISTNODEPTR , int); // 此处不同
void printlist(LISTNODEPTR);
void freelist(LISTNODEPTR); // 增加
void _tmain(int argc, _TCHAR* argv[])
{
LISTNODEPTR newPtr=NULL;
int i,a;
for(i=0;i<3;i++){
printf("please enter a number/n");
scanf("%d,",&a);
newPtr = list(newPtr,a); // 此处注意
}
printlist(newPtr);
freelist(newPtr); // 此处
return 0;
}
LISTNODEPTR list(LISTNODEPTR sPtr, int a)
{
if ( sPtr != NULL )
sPtr->nextPtr = list( sPtr->nextPtr, a ); // 递归,向后面的节点上加数据。
else
{
sPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE)); // 注意,是节点的尺寸,类型转换,关于这里,发现了点问题.
sPtr->nextPtr = NULL;
sPtr->data = a;
}
return sPtr;
}
void freelist(LISTNODEPTR sPtr )
{
if ( sPtr != NULL )
{
freelist( sPtr->nextPtr ); // 递归, 先释放后面的节点
free( sPtr ); // 再释放本节点
}
else //
return ; // 此两行可不要
}
void printlist(LISTNODEPTR currentPtr)
{
if(currentPtr==NULL)
printf("The list is empty/n");
else
{
printf("This list is :/n");
while(currentPtr!=NULL)
{
printf("%d-->",cu
4000
rrentPtr->data);
currentPtr=currentPtr->nextPtr; // 这里不一样
}
printf("NULL/n/n");
}
}
在那里,代码简化为:
LISTNODEPTR sPtr;
sPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE));
sPtr明明是一个指向listNode结构的指针,为什么不分配给它一个指针大小的内存呢?像这样:
sPtr=(LISTNODEPTR)malloc(sizeof(LISTNODEPTR)); //同时,把释放内存函数改成如下:
void freelist(LISTNODEPTR sPtr )
{
if ( sPtr != NULL )
{
freelist( sPtr->nextPtr ); // 递归, 先释放后面的节点
}
else
free( sPtr ); // 再释放本节点
return;
}
如果不改释放内存函数,程序在释放内存时出错.什么原因呢?
相关文章推荐
- malloc函数能分配多少内存
- Win8系统需要设置虚拟内存吗?Win8虚拟内存设置多少合适?
- 一些存储概念自己有用需要封装内存分配函数是了解
- 遇到 java.lang.OutOfMemoryError: PermGen space配多少合适我的内存为4G在哪配置Jboss的run.bat还是。。
- 题:若内存按字节编址,用存储容量为32K*8比特的存储芯片构成地址编号A0000H到DFFFFH的内存空间,则至少需要多少片?
- 链表创建为什么需要使用内存分配?
- windows平台一个程序究竟占用多少内存?
- 成功创办一个公司究竟需要多少钱?
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- malloc函数进行内存分配是在什么阶段?
- 新概念每天学多少合适? 新概念学习方法汇总?上班族该如何分配时间学新概念?
- 报ORA-4031错误时,我们通常可以根据Oracle无法分配多少字节的内存,来判断共享池碎片的严重程度,以下是4031错误官方的解释
- 用户数1000个左右的环境不知道服务器应该配多少内存才合适?
- 在一台服务器上面,JVM可以分配到的最大内存是多少?
- 初始化指针是否需要分配内存空间
- 【转】java虚拟机参数详解之-Xms/-Xmx,运行时内存分配多少
- 我到底需要多少内存(part 2) - 什么是shallow heap?
- Nginx中slab分配大内存时需要注意的地方
- linux下,一个运行中的程序,究竟占用了多少内存?
- 成功创办一个公司究竟需要多少钱?