众所周知,程序一般都是加载到内存中去运行的,理解这个内存分配的方式也是至关重要的,因为只有透彻理解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)养成良好的编程习惯,在申请内存后,要及时检测返回值,检查是否申请成功。