指针函数:返回值为指针的函数
#include <stdio.h>
2
3
4 char *fun()
5 {
6 char str[] = “hello world!”;
7 return str;
8 }
9
10 int main()
11 {
12 char *p = fun();
13 puts(p);
14 return 0;
15 }
得不到想要的结果,打印出来的内容为随机值
原因:str为局部变量,生命周期从定义开始到函数执行结束就结束了
所以:p指向了一块已经被释放掉的内存空间
怎么解决:延长str的生命周期
1、static–》延长该局部变量的生命周期
2、malloc
char *fun()
7 {
8 //static char str[] = “hello world!”;
9 char *str = (char *)malloc(100);
10 if(NULL == str)
11 {
12 printf(“malloc error!\n”);
13 return NULL;
14 }
15 memset(str, 0, 100);
16 strcpy(str, “hello world!”);
17 return str;
18 }
19
20 int main()
21 {
22 char *p = fun();
23 puts(p);
24 free(p);
25 p = NULL; //防止再去操作已经被释放掉的内存空间
26 return 0;
27 }
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–要操作的内存空间的大小
返回值:要操作的内存空间的首地址
int
*p;
p = (
int
*)
malloc
(
sizeof
(
int
) * 128);
//分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double
*pd = (
double
*)
malloc
(
sizeof
(
double
) * 12);
//
分配12个double型存储单元,并将首地址存储到指针变量pd中
free(p);
free(pd);
p = NULL;
pd = NULL;
指针用完赋值NULL是一个很好的习惯。