关于malloc()及内存的一些理解

今天尝试写了一下通讯录,过程中发现了一些问题。我们用的是结构体指针数组,结构体指针数组其实就是指针数组。

它的元素是一群指向结构体数组元素地址的地址。先看一下定义吧:

struct person
{
    int num;
    char name[20];
};
int main()
{
    struct person *p[10] = (struct person*)malloc(sizeof(struct person));
    return 0;
}

这是一个最基本的声明加定义,既然声明了p[10]是一个结构体指针数组,那么他的元素就是10个指针,指针的作用就是指向一段地址,很明显这个p[10],里面的每个元素都是指向一个person类型的结构体;所以在明白了这是一群指针组成的数组,我们定义时就必须给它初始化,或者给他分配一段空间。说到空间就提到了这几天我一直困惑的malloc函数,今天算是稍微理清楚了malloc的相关方面知识。

首先malloc()函数返回的是一个指针,即一个地址。所以我们在初始化时写的这句话就很好理解了:malloc函数在堆里开辟了一段我们指定大小的空间返回一个地址,然后用p去接收这个地址,即p指向这段堆里的地址。我们用malloc函数分配空间时,就是堆里通过链表的形式给我们分配了一段动态地址,它是一段连续的空间,但是这段空间也很有可能是通过链表找的大量小空间进行整合而成的。

char *p = (char*)malloc(sizeof(char)*32);
if(NULL == P)
   {
    exit(0);
   }

这就很好理解前面关于指针博客里面举的例子里为什么会取指针的地址传递。还有需要注意的一点是用malloc()时,要及时释放空间即free();如果不释放这段空间的话计算机是不会自动释放这段内存,所以就会造成内存泄漏。释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用它造成无法预测的损害,标准的过程如下:

char *p = (char *)malloc(sizeof(char)*32);
free(p);
p = NULL;

释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。malloc()函数返回值类型是void*所以赋值时候应该加上强制类型转换比如字符型(char *) ,结构体指针数组类型(struct person *)。

猜你喜欢

转载自blog.csdn.net/LX370ZZZ/article/details/81291079