今天来讨论一下C中的内存管理。
记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面
我说所有指针使用前都必须初始化,结构体中的成员指针也是一样
有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗
那时我不知怎么的想不出理由,虽然我还是坚信要初始化的
过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针)
那时在忙着整理文档,没在意
今天抽空调了一下,结论是,还是需要初始化的。
而且,不写代码你是不知道原因的(也许是对着电脑久了IQ和记性严重下跌吧)
测试代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char *name;
int score;
struct student* next;
}stu,*stu1;
int main(){
stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/
strcpy(stu.name,"Jimy");
stu.score = 99;
stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/
stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/
stu.next = stu1;
strcpy(stu1->name,"Lucy");
stu1->score = 98;
stu1->next = NULL;
printf("name %s, score %d \n ",stu.name, stu.score);
printf("name %s, score %d \n ",stu1->name, stu1->score);
free(stu1);
return 0;
}
写测试代码的过程中我明白了,同事所说的二叉树遍历算法中所用的左子树和右子树指针不需要初始化,其实是这样的,左子树和右子树指向的必须是二叉树节点类型的结构体指针(你填一个长度相同的指针也可以),而该结构体指针是需要初始化的(见注释2),也就是并没有通过malloc来分配内存,
而是将另一个指针的值赋给它
顿时觉得挺无语的,确实,看了很多大学里的教材,对于二叉树的遍历等算法定义的结构体无非是以下形式
struct node{
int data;
struct node* lchild, rchild;
};
使用时都直接的
struct node* root;
root = (struct node*)malloc(sizeof(struct node));
root->data = 3;
struct node* nlchild;
nlchild = (struct node*)malloc(sizeof(struct node));
root->lchild = nlchild;
nlchild->data = 2;
struct node* nrchild;
nlrchild = (struct node*)malloc(sizeof(struct node));
root->rchild = nrchild;
nrchild->data = 4;
这样子给人造成一种错觉好像结构体成员指针是不用初始化的。
可是,只要是指针,要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据!
C语言的内存管理很重要,集魄力和麻烦于一身,看你自己的心态如何了。如果你积极的面对,你正在控制一切;如果你觉得烦躁,你正不得不控制一切。C仍旧是博大精深的语言,信C哥!
/*附加:仍旧是指针*/
stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/
这一句可能会有人把sizeof里边也填成struct student*
可以理解这样的行为,因为stu本来就是struct student*,可是这样子你就没有为结构体分配足够的内存,使用中会因为内存错误同样报错的。
当然,仅仅为结构体指针分配内存还不够,结构体成员指针仍然需要分配内存,如下
stu1->name = (char*)malloc(sizeof(char));
分享到:
相关推荐
1、给设计一种结构体,用来保存学生信息(包括学号、姓名、三科成绩、平均成绩)。除平均成绩外,各项数据均由键盘输入。现在要求输入若干学生的信息,并实现以下功能:(可以使用数组或链表实现) 1)计算学生的...
SPT-C语言基础-结构体指针.pdf
在C语言中,为了使用方便和使程序直观,可以把(*p).num改用p->num来代替,即:p所指向的结构体变量中的num成员。 3-1 指向结构体变量的指针 以下3种形式等价: 结构体变量.成员名; (*p).成员名; p->成员名。 3-2 ...
C语言的指针和结构体ppt课件.ppt
包含链表的建立,插入,删除,查找操作,结构清晰,指针及结构体运用灵活,针对性强,有助于对C语言的深入理解
在学习stm32嵌入式开发过程中,关于对GPIOA等地址的强制性结构体指针类型转换的参考依据!
(2)掌握结构体数组、结构体指针的定义和使用; 1、输入5位同学的一组信息,包括学号、姓名、数学成绩、计算机成绩,求得每位同学的平均分和总分,然后按照总分从高到低排序。 2.定义一个结构体变量(包括年、月、...
C语言-电费管理系统--可用来学习C语言 1. 可实现基本的增删改查功能,可进行开户功能,即添加用户信息;销户功能即删除用户信息;...如结构体、各种语句、文件、指针等; 7. 此系统可用来学习参考、kechengsheji。
C语言-银行管理系统 ...3. 可实现取款业务 4. 可实现投诉业务功能,录入、查询意见 6. 采用文件操作;可新建文件、读取文件、写入文件;...如结构体、各种语句、文件、指针等; 9. 此系统可用来学习参考、kechengsheji。
C语言-学生成绩管理系统02--可用来学习C语言 1. 可实现对学生信息进行登记、删除、查询、修改的基本功能 2. 可对录入的信息进行保存,...如结构体、各种语句、文件、指针等; 9. 此系统可用来学习参考、kechengsheji。
结构体可以看做是C语言中的类 但是结构体中不能封装函数,只能有数据成员 这个程序演示了如何像c++的类一样在结构体中增加函数 如果有错误,欢迎交流
C语言的指针使用与结构体的使用,很多公司笔试题目也包含在里面
C语言全套资料 C语言程序设计 C语言算法 C语言课件 C语言顺序程序设计,C语言数组,C语言循环控制,C语言预处理命令,C语言文件操作指针,C语言选择结构程序设计,C语言结构体与共用体,C语言文件操作,C语言函数
文章主要介绍在c语言中用结构体和指针构造链表的方法,感兴趣的朋友可以看看。
变量与表达式 ;控制语句 ;数组 ;函数 ; 指针 ; 结构体 ;文件
该资源涵盖了C语言的重要知识, 重点讲及了 指针、数组、结构体、链表方面的知识 是学习C语言的好资料啊
1、给设计一种结构体,用来保存学生信息(包括学号、姓名、三科成绩、平均成绩)。除平均成绩外,各项数据均由键盘输入。现在要求输入若干学生的信息,并实现以下功能:(可以使用数组或链表实现) 1)计算学生的...
C语言的简单基本实例,包括循环、嵌套、数组、指针、函数、结构体等内容。
C语言的必须要掌握的知识例如指针结构体字符
C语言结构体,可谓是C强大功能之一,也是C++语言之所以能衍生的有利条件,事实上,当结构体中成员中有函数指针了后,那么,结构体也即C++中的类了。 C语言中,结构体的声明、定义是用到关键字struct,就像联合体用到...