c语言中结构,动态分配内存的理解

首先写一些基本的东西,譬如关于c语言语法的,还有一些注意事项。

struct student {
             int age;
             char *number;
             int score;
};
//这段代码会创建一个自定义的数据类型,叫做struct student
//或者使用typedef来简化
typedef struct student{
             int age;
             char *number;
             int score;
}student;
//这样为struct student 起了一个别名叫做student.
//以上都是创建这样一个属于你自己的数据结构
student li_ming={18,"12345",97};
//这个是创建具体的数据,student叫做数据类型,li_ming为变量名

当时用结构指针时,表述如下

void string_compare(student *li_ming)//说明需要传递一个结构指针
{
//函数体
}

string_compare(&xiao_ming)//xiao_ming是一个结构变量,&为取地址符号

(*li_ming).age=18;
li_ming->age=18;
//上面两种表述都可以,这里li_ming是一个结构指针

为了对比,下面简单说一下联合union.

typedef union{
        int age;
        char* number;
}student;
//创建一个union数据结构

student li_ming={.age=18};
//union的数据结构在创建时只会保存一个值,这样可以节省空间。

再谈谈枚举。

enum color={RED,GREEN};
或者
typedef enum{
             RED,GREEN
 }color;
 //枚举就是说你只能在RED,GREEN中选择。

下面简单说一下链表,他就是一种抽象数据结构,每一个结构中保存了下一个同样结构的地址。如果用结构struct来写的话如下

typedef struct student{
            int age;
            char *number;
            struct student *next;//这里创建了一个结构指针
}student

下面写个简单的例子加强印象,,,其实是为了灌水

#include<stdio.h>
int main()
{
 typedef struct train_line{
 char* initial_station;
 char* finally_station;
 int longth;
 struct train_line *next; 
}train_line;

train_line jingguang={"changsha","zhengzhou",800,NULL};
train_line longhai={"zhengzhou","baoji",1000,NULL};
train_line baocheng={"baoji","chengdu",300,NULL};

jingguang.next=&longhai;
longhai.next=&baocheng;

int buff;
fscanf(stdin,"%i",&buff);
switch(buff){
     case 1:
    {
        fprintf(stdout,"\
%s\n",jingguang.initial_station);
    break;
    }
     case 2:
    {
    fprintf(stdout,"%s\n",longhai.initial_station);
    break;
    }
     case 3:
    {
    fprintf(stdout,"%s\n",baocheng.initial_station);
    break;
    }
}
//注意点switch语句的使用方法,case中只能是单个字符,不能是字符串

今天写的东西都是一些基础的,百度上一大堆的东西,,可我还是写下来了。。。。

下面再写一下动态分配内存的问题:
先回顾一下知识点;
(1)栈:用来保存局部变量的区域,一旦函数返回,该变量被收回
(2)堆:用于长期保存数据的地方,不会自动清除。
(3)malloc()函数,让操作系统给你分配空间,返回值为该地址void *类型指针。要写stdlib.h的头文件。
(4)free()函数,释放空间

下面自己动手写一个有关于动态分配的例子,不是很全,希望大家批评改正。

首先我的意思很简单,创建这样一个结构,结构中保存着自己的名字,以及父亲和母亲的结构指针,这样就可以通过自己找到父亲母亲的相关信息
首先写一个头文件叫做declare.h

#ifndef DECLARE_H
#define DECLARE_H


typedef struct family{
    char* self_name;
    struct family* mum;
    struct family* dad;
}family;
//上面是这个结构的声明,实际上编译时并没有分配内存
family* create(char* self_name);
//这个是函数的声明,注意要放到上面结构声明的下面,否则会出先未定义的错误
#endif

创建一个函数,保存在create.c的文件中

#include"declare.h"
#include<string.h>//strdup()字符串复制函数位于这个头文件中
#include<stdlib.h>//由于malloc()函数位于这个头文件之中
family* create(char* self_name)
{
family* buff=malloc(sizeof(family));
buff->self_name=strdup(self_name);
buff->mum=NULL;
buff->dad=NULL;
return buff;
}

接下来写主函数

#include<stdio.h>
#include"declare.h"
int main()
{
family* wujunyi=create("wujunyi");
family* wuguannan=create("wuguannan");
family* liuhongju=create("liuhongju");
wuguannan->mum=liuhongju;
wuguannan->dad=wujunyi;
fprintf(stdout,"%s\n",wuguannan->mum->self_name);

}

最后自己使用gcc编译

gcc main.c create.c -o main

其实最开始的时候,我不知道把申明的struct结构变量放到哪里去,所以一直编译不通过,后来无意间看了赵岩的《C语言点滴》中关于声明和定义的那几章才发现错误,这里也是感谢。其实程序本身很简单,主要是体会这样一个过程。最后再写一个makefile吧

c_learning.o: c_learning.c create.c declare.h
    gcc -c c_learning.c
create.o: create.c declare.h
    gcc -c create.c
c_learning: c_learning.o create.o
    gcc c_learning.o create.o -o c_learning
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值