知识导图
函数、内存空间划分、指针练习题
1.在堆区申请两个长度为32的空间,实现两个字符串的比较(非库函数实现)
要求:
1>定义函数,在堆区申请空间(两个申请,主函数需要调用2次)
2>定义函数,实现字符串的输入void input(char *p)
3>调用函数实现字符串比较,在主函数中输出大小:
int my_strcmp(const char *s1,const char *s2)
4>定义函数,释放空间
#include <stdio.h>
#include <stdlib.h>
//定义函数,在堆区申请空间
void my_malloc(char **str)
//函数的形参是局部变量,存在栈区,函数执行结束会自动释放空间
//这里用二级指针就不会把传进来的堆区字符串指针释放掉了
{
*str=(char*)malloc(32);
}
//定义函数,实现字符串的输入
void input(char *p)
{
scanf("%s",p);
}
//定义函数,实现字符串比较,返回大小
int my_strcmp(const char *s1,const char *s2)
{
char *p1=s1,*p2=s2;
while(*p1!='\0')
{
if(*p1!=*p2)
{
break;
}
p1++;
p2++;
}
if(*p1>*p2)
{
printf("%s比%s大\n",s1,s2);
}else if(*p1<*p2)
{
printf("%s比%s大\n",s2,s1);
}else
{
printf("%s和%s一样大\n",s1,s2);
}
return *p1-*p2;
}
//定义函数,释放空间
void my_free(void **p)
//函数的形参是局部变量,存在栈区,函数执行结束会自动释放空间
//这里用二级指针就不会导致重复释放传进来的堆区地址指针了
{
//释放空间
free(*p);
//防止野指针,需要把释放后的指针指向置空
*p=NULL;
}
int main(int argc, const char *argv[])
{
typedef char *STR; //使用了类型重定义
STR str1; //初始化定义了两个字符串
STR str2;
my_malloc(&str1); //调用函数申请两个长度为32字节大小的空间
my_malloc(&str2);
//调用函数输入两个字符串
input(str1);
input(str2);
//输出两个字符串
puts(str1);
puts(str2);
//调用比较两个字符串的函数
printf("比较字符串大小函数返回值:%d\n",my_strcmp(str1,str2));
//调用函数释放空间
my_free(&str1);
my_free(&str2);
return 0;
}