结构体中动态内存的管理(结构体中动态内存的管理(malloc和和free))
C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存
的释放。虽然这是我们已经很熟悉的,但是还是存在一些问题。特别是当结构体中存在指针的情况下,各种问
题也就会展现出来。
其中最大的问题是:结构体中指针变量没有指向一块合法的内存空间,就对指针参数进行操作,这也是很多C语言程序员经常
犯的错误。
简单的实例如下:
struct student
{
char *name;
int score;
}stu,*pstu;
int main()
{
strcpy(stu.name,"Jimy");
stu.score = 99;
strcpy(pstu->name,"Jimy");
pstu->score = 99;
}
这种代码是新手经常犯的错误,其中的主要错误是指针变量没有指向一块内存空间,其中包括ptest没有指向一块内存空间,
同时结构体中的指针变量name也没有指向一块内存空间。
这种代码一般都会编译通过,但是运行过程中会发生新手编程经常出现的段错误Segmentation fault (core dumped),我通过
gdb对程序进行调试发现了存在的一些问题。其中stu.name中的内容是0x0,也就是地址0x0。这样我就知道了0x0为什么会发
生段错误了,因为在Linux中进程都有一个独立的虚拟存储空间4G,但是其中在最底部的0x0是没有映射的,具体的参看进程的
存储器映射关系。0x0并没有映射,这样发生段错误也就不奇怪了。
也就是说指针变量里存储的地址值并不是一个我们需要的值,为了指向一块内存空间,因此需要采用malloc分配一块内存空
间。
改写上面的代码实现内存的分配。
int main()
{
/*创建一块内存空间,并让stu.name指向这块内存空间*/
stu.name = (char *)malloc(20*sizeof(char));
/*实现字符串的复制过程*/
strcpy(stu.name,"Jimy");
stu.score = 99;
/*创建一块内存空间,并让pstu指向这块内存空间*/
pstu = (struct student *)malloc(sizeof(struct student));
/*创建一块内存空间,并让pstu->name指向这块内存空间*/
pstu->name = (char *)malloc(20*sizeof(char));
/*实现字符串的复制过程*/
评论0