函数指针与指针函数:
函数指针:指向函数的指针
例如:定义一个指针,指向一个有一个int类型的参数并且返回值也为int类型的函数
int fun(int a);
int (*p)(int) = fun;
指针函数:返回值为指针的函数
#include <stdio.h>
char *fun()
{
char str[] = "hello world!";
return str;
}
int main()
{
char *p = fun();
puts(p);
return 0;
}
得不到想要的结果,打印出来的内容为随机值
原因:str为局部变量,生命周期从定义开始到函数执行结束就结束了
所以:p指向了一块已经被释放掉的内存空间
怎么解决:延长str的生命周期
1、static--》延长该局部变量的生命周期
2、malloc
char *fun()
{
//static char str[] = "hello world!";
char *str = (char *)malloc(100);
if(NULL == str)
{
printf("malloc error!\n");
return NULL;
}
memset(str, 0, 100);
strcpy(str, "hello world!");
return str;
}
int main()
{
char *p = fun();
puts(p);
free(p);
p = NULL; //防止再去操作已经被释放掉的内存空间
return 0;
}
malloc:程序员在堆区手动申请内存空间
free:程序员手动释放申请的空间
void *malloc(size_t size);
参数:size--要申请的字节数
返回值:成功:申请到的内存空间的首地址
失败:NULL---内存不足时
void free(void *ptr);
参数:ptr--要释放的内存空间的首地址
void *memset(void *s, int c, size_t n);
功能:使用一个字节的常量填充一块内存空间
一般用于清空一块内存空间,也就是这个常量为0
参数:s--要操作的内存空间的首地址
c--常量
n--要操作的内存空间的大小
返回值:要操作的内存空间的首地址