#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]);
}
}