中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
究竟需要给Malloc函数分配多少内存才算合适呢?
作者:未知 时间:2005-07-27 23:27 出处:CSDN 责编:chinaitpower
              摘要:究竟需要给Malloc函数分配多少内存才算合适呢?

下面是一个用指针操作链表的程序,网上的例子.觉得不错.很典型.先拿它来开刀.

#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-->",currentPtr->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; 
 }
 

如果不改释放内存函数,程序在释放内存时出错.什么原因呢?


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有