众所周知,程序一般都是加载到内存中去运行的,理解这个内存分配的方式也是至关重要的,因为只有透彻理解C语言内幕,才能真正灵活运用,而不能拘泥于表象。
相关知识图如下:
示例代码:
/* dyBlock.c --- * * Filename: dyBlock.c * Description: 动态内存的分配 * Author: magc * Maintainer: * Created: 二 7月 31 06:39:57 2012 (+0800) * Version: * Last-Updated: 三 8月 1 06:48:35 2012 (+0800) * By: magc * Update #: 60 * URL: * Keywords: * Compatibility: * */ /* Commentary: * * * */ /* Change Log: * 增加通过指针变量employeeT来确定所点空间大小 * */ /* Code: */ #include <assert.h> #include <ctype.h> #include <errno.h> #include <limits.h> #include <string.h> #include <stdarg.h> #include <stdlib.h> #include <stdio.h> typedef char * string; typedef struct{ string name; string title; int number; } * employeeT; //typedef employeeT * employeePtr; void outputArray(int *a,int len); int main(int argc, char * argv[]) { int *dyArray = malloc(sizeof(int)*10);//动态数组的声明与内存分配 int arr[10];//声明时大小必须是常数,声明书时就完成了内存分配 if(dyArray==NULL)error("no memory available");//养成良好的编程习惯,及时检测返回值 int i; for (i = 0; i < 10; i++) { dyArray[i] = i*3; } outputArray(dyArray,10); //动态记录 employeeT emptr = malloc(sizeof(*(employeeT)(NULL)));//注意此处获取记录所占空间的方式 if(emptr == NULL)error("no memory available !\n"); emptr->name = "haha"; emptr->number = 0100; emptr->title = "welcome"; printf("动态记录 name=%s,number=%d,title=%s\n",emptr->name,emptr->number,emptr->title); // emptr. } /************************************************************************** 函数名称: 功能描述:输出数组的各项内容 输入参数: 返 回: **************************************************************************/ void outputArray(int *a,int len) { int i; for (i = 0; i < len; i++) { printf("a[%d]=%d;",i,a[i]); } printf("\n"); } /* dyBlock.c ends here */
在GCC下编译输出内容为:
注:
1)体会动态内存的分配过程,及其优点(根据实际需要动态申请内存)
2)动态数组与普通数组的区别,就在于内存的分配,普通数组在声明时就需要确定大小,并分配到指定的内存,而动态数组声明时并不分配内存,也不需要事先声明大小,而在调用malloc()函数时,才分配内存,确定大小。
3)动态记录要注意确定记录的大小
4)养成良好的编程习惯,在申请内存后,要及时检测返回值,检查是否申请成功。