#include<stdio.h>
#include<stdlib.h>//也可使用#include<malloc.h>
#include<string.h>
int main(){
char *p;//定义一个字符指针变量 p
p=(char *)malloc(10*sizeof(char));//使用 malloc()函数为其分配长度为 10 个连续的字符空间,将该存储空间的首地址赋给 p
strcpy(p,"China");//再将字符串"China"放到这个存储空间中
printf("%c\n",*p);//输出C 存储空间的首地址
printf("%s\n",p);//输出China
free(p);
return 0;
} //此处我使用的是DevC++编译
p=(char*)malloc(10*sizeof(char));
p:指针变量
(char*):强制类型转换,转换为字符指针
10:分配的字符个数
sizeof(char) :求每个字符占用的空间大小
注:指针变量p属于自动变量,它自身的存储空间由系统自动分配和释放,
但用 malloc()函数分配的存储空间(也就是 p指向的存储空间)不会被系统自动释放,
所以需要使用free(p)释放
下面我们看一个更难点的demo
#include<stdio.h>
#include<malloc.h>//也可使用#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
typedef struct SL{//SL可删去,这是结构体知识点
ElemType data[MaxSize];
int length;//记录当前元素的个数
}SqList;
void CreateList(SqList* &L,ElemType a[],int n)//结构体类型的一个指针,&是引用调用(传址)
{
L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间,从内存要404个字节 一个int 4个字节 再加一个整型 //整体建立顺序表
for(int i=0;i<n;i++){
L->data[i]=a[i];
}
L->length=n;
}
void DispList(SqList *L){
for(int i=0;i<L->length;i++){
printf("%c ",L->data[i]);
}
printf("\n");
}
void DestroyList(SqList * &L)
{
free(L);
}
int main(){
char *p;//定义一个字符指针变量 p
p=(char *)malloc(10*sizeof(char));//使用 malloc()函数为其分配长度为 10 个字符的存储空间,将该存储空间的首地址赋给 p,,再将字符串"China"放到这个存储空间中
strcpy(p,"China");
printf("%c\n",*p);
printf("%s\n",p);
free(p);
SqList *Ls;
ElemType c[5]={97,65,'c','d',100};//65->A
CreateList(Ls,c,5);
DispList(Ls);
DestroyList(Ls);
return 0;
}
注:这种动态存储空间分配方式的优点是不需要预先分配存储空间,分配的空间可以根据程序的需要扩大或缩小,如链式存储结构通常采用动态存储空间分配方式。其缺点是需要程序员简单地管理内存空间,也就是用 malloc()函数动态分配的空间,在后面一定要用free()函数释放,否则动态分配的空间对于程序而言就丢失了,久而久之可能会造成内存泄露。