C语言——内存分配

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 1
//4.1任务1:使用malloc和free完成动态内存的分配和释放(
 /*int main(void) {

 //int *pn = NULL;
 int *pn = (int*) malloc(sizeof(int));
 *pn = 25;
 printf("pn=%d\n", pn);
 printf("*pn=%d\n", *pn);
 *pn = 100;
 printf("pn=%d\n", pn);
 printf("*pn=%d\n", *pn);
 free(pn);
 printf("pn=%d\n", pn);
 printf("*pn=%d\n", *pn);
 pn = NULL;
 printf("%d\n", pn);
 double *pf = (double*) malloc(sizeof(double));
 *pf = 10.25;
 printf("*pf=%.2lf\n", *pf);
 printf("pf=%.2lf\n", pf);
 free(pf);
 pf=NULL;
 printf("%lf\n",pf);
 return EXIT_SUCCESS;
 }
 */

//依次按照下面要求完成操作:
//定义一个double类型的指针parray,在定义时使用malloc为其分配一个长度为3的动态数组。
//为动态数组赋值:100, 20.5, 34.2。
//显示指针变量parray的值。
//依次显示指针parray所指向的动态数组的值,以及每个数组元素的地址。
//使用free释放动态数组,并将指针parray的值赋值NULL。

/*int main(){
 double *parray = (double*) malloc(sizeof(double)*3);
 *parray=100;
 *(parray+1)=20.5;
 *(parray+2)=34.2;

 printf("%.1lf\n",*parray);
 printf("%.1lf\n",*(parray+1));
 printf("%.1lf\n",*(parray+2));

 printf("%x %x %x",parray,(parray+1),(parray+2));

 free(parray);
 parray=NULL;

 return 0;
 }
 */

//4.3任务3:结合malloc和free使用char指针处理字符串
/* int main() {
 //char *address=NULL;
 char *address = (char*) malloc(sizeof(char) * 20);
 memset(address, 0, 20);
 strcpy(address, "Beijing");
 printf("%s\n", address);
 char *area = "Chaoyang";
 address = area;
 printf("%s\n", address);
 char zone[] = "ABCD";
 address = zone;
 printf("%s\n", address);
 free(address);
 return 0;
 }*/

//实现一个“可变二维数组”,这个二维数组的行数要求用户从键盘输入,每行的元素个数仍由用户从键盘输入。
//数组元素值用户可以自定义。最后把二维数组打印出来。不要忘记释放数组内存。
/*void main()
 {
 int rows;
 int **row;
 int *q,*p;
 int i,j;
 printf("请输入行数:\n");
 fflush(stdout);
 scanf("%d",&rows);
 row=(int **)malloc(sizeof(int)*rows);
 if( NULL == row)
 {
 printf("Insufficient memory available!\n" );
 return;
 }
 p=(int *)malloc(sizeof(int)*rows);
 if( NULL == p)
 {
 printf("Insufficient memory available!\n" );
 free(row);
 row=NULL;
 return;
 }
 for(i=0;i<rows;i++)
 {
 printf("请输入第%d行的元素个数:\n",i+1);
 fflush(stdout);
 scanf("%d",&p[i]);
 row[i]=(int *)malloc(sizeof(int)*p[i]);
 if( NULL ==row[i])
 {
 printf("Insufficient memory available!\n" );
 free(p);
 p=NULL;
 return;
 }
 q=row[i];
 for(j=0;j<p[i];j++)
 q[j]=1;
 }
 for(i=0;i<rows;i++)
 {
 q=row[i];
 for(j=0;j<p[i];j++)
 {
 printf("%d",q[j]);
 }
 printf("\n");
 }
 free(p);
 p=NULL;
 for(i=0;i<rows;i++)
 {
 free(row[i]);
 row[i]=NULL;
 }
 free(row);
 row=NULL;
 }*/

//编写一个函数,此函数使用动态存储分配来产生一个字符串的副本。例如函数为strclone,
//则调用p=strclone(str),将会为一个新的字符串分配和str占内存大小相同的一个字符串,并将字符串str的内容复制给该新字符串,
//然后返回指向新字符串的指针,如果分配失败则返回一个空指针。
/*char* _strdup(const char *str)
{
 unsigned int length=strlen(str)+1;
 char* strNew=(char*)malloc(length);
 if (strNew == NULL)
 {
  return NULL;
 }
 if(*str!='\0')
 {
  char* tmp=strNew;
  while(*str!='\0')
  {
   *strNew=*str;
   strNew++;
   str++;
  }
  *strNew='\0';
  return tmp;
 }
 else
 {
  return NULL;
 }
}

int main()
{
 char *str;
 char *string = "hello world!";
 str =_strdup(string);
    printf("新字符串为:%s\n",str);
 free(str);
 str=NULL;
 return 0;
}*/

//依次按照下面要求完成操作:
/*(1) 定义一个char指针name,用于保存姓名信息(字符串),初始化为NULL。
(2) 使用malloc为name分配长度为30的动态字符数组,用于保存字符串。
(3) 使用memset将name字符数组清零,分析执行结果。
(4) 使用strcpy为name赋值字符串"Ramos"。
(5) 输出name中字符串的值。
(6) 定义另一个字符指针Firstname,在定义时直接使用"="赋值字符串"Sergio"。
(7) 将Firstname中的字符串,赋值给name。并显示赋值后name中的字符串。
(8) 定义字符数组club,并初始化"RM"。
(9) 将club中的字符串,赋值给name。并显示赋值后name中的字符串。
(10) 释放为name所分配的动态数组。*/
/*int main() {
 char *name = (char*) malloc(sizeof(char) * 30);
 memset(name, 0, 30);
 strcpy(name, "Ramos");
 printf("%s\n", name);
 char *Firstname = "Sergio";
 name = Firstname;
 printf("%s\n", Firstname);
 char club[] = "RM";
 name = club;
 printf("%s\n", club);
 free(name);
 return 0;
 }*/

//建立一个学生结构数组来记录学生信息(学号ID,姓名和C语言成绩),要求动态建立一个结构数组,数组长度从键盘输入,
//自行给数组元素赋值并打印学生信息,最后不要忘记释放内存。
struct student
{ char num[6];
  char name[8];
  int score[4];
}stu[N];

int main()
{void print(struct student stu[6]);
int i,j;
for (i=0;i<N;i++)
{printf("input score of student %d:",i+1);
printf("\n");
  printf("NO.: ");
  fflush(stdout);
  scanf("%s",stu[i].num);
  printf("name: ");
  fflush(stdout);
  scanf("%s",stu[i].name);
  for (j=0;j<3;j++)
    {printf("score %d:",j+1);
    fflush(stdout);
     scanf("%d",&stu[i].score[j]);
    }
}
print(stu);
return 0;
}

void print(struct student stu[6])
 {int i,j;
  printf("学号ID,姓名和C语言成绩:");
  printf("\n");
  for (i=0;i<N;i++)
   {printf("%s,%s",stu[i].num,stu[i].name);
    for (j=0;j<3;j++)
      printf("%d,",stu[i].score[j]);
   }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值