冷回清风暖 发表于 2020-11-9 10:39:52

结构体malloc申请空间

已经自己调了一天了,没搞懂为什么{:5_104:} ,所以来寻求大家的帮助了。{:5_109:}
先附上代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

typedef struct VNode{
        int adjvex;//顶点序号
        char data;//顶点名称
        double x, y, z;//顶点的三维坐标
        struct VNode* next;//指向下一个顶点的指针
}VNode,*VTable;//顶点表

typedef struct Tri_VNode {
        int tadjvex;//三角形序号
        char data;//三角形名称
        intadjvex1;//顶点1
        intadjvex2;//顶点2
        intadjvex3;//顶点3
        struct Tri_VNode* next;//指向下一个三角形的指针
}Tri_VNode,*TriVTable;//三角形表

typedef struct {
        VTable VT;
        TriVTable TRT;
        int vexnum, trinum;//顶点数,三角形个数
}TIN;

bool InitVTable(TIN** t) {
        *t = (TIN*)malloc(sizeof(TIN));
        TIN* tin = *t;
        tin->trinum = tin->vexnum = 0;//初始化顶点个数及三角形个数
        //初始化顶点表
        VNode* VT = tin->VT;
        VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
        if (!VT) return false;
        VT->next = NULL;
        VT->adjvex = -1;
        VT->x = VT->y = VT->z = -1;
        memset(VT->data, 0, sizeof(char) * 50);
        //初始化三角形表
    Tri_VNode* TRT = tin->TRT;
        TRT = (TriVTable)malloc(sizeof(Tri_VNode));
        if (!TRT) return false;
        TRT->next = NULL;
        TRT->tadjvex = -1;
        TRT->adjvex1 = TRT->adjvex2 = TRT->adjvex3 = -1;
        memset(TRT->data, 0, sizeof(char) * 50);
        return true;
}
*t = (TIN*)malloc(sizeof(TIN));利用该语句对TIN结构体进行赋值,但是发现VTable和TriVTable没有获得地址。
于是采用VNode* VT = tin->VT;
        VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
这种方式尝试为TIN 结构体中的VTable进行存储空间申请,但无法改变结构体中改部分的地址。
调试中各变量的地址如下

xieglt 发表于 2020-11-9 10:43:08

本帖最后由 xieglt 于 2020-11-9 11:04 编辑

先睹为快
你没有给他们赋值他们怎么会有值呢?

bool InitVTable(TIN** t)
{
      *t = (TIN*)malloc(sizeof(TIN));
      TIN* tin = *t;
      tin->trinum = tin->vexnum = 0;//初始化顶点个数及三角形个数
      //初始化顶点表
      VNode* VT = tin->VT;                //这句无意义,赋值不是这样赋的
      VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
      if (!VT) return false;
      VT->next = NULL;
      VT->adjvex = -1;
      VT->x = VT->y = VT->z = -1;
      memset(VT->data, 0, sizeof(char) * 50);

      //要赋值
        (*t)->VT = VT;

      //初始化三角形表
       Tri_VNode* TRT = tin->TRT;//这句无意义,赋值不是这样赋的
      TRT = (TriVTable)malloc(sizeof(Tri_VNode));
      if (!TRT) return false;
      TRT->next = NULL;
      TRT->tadjvex = -1;
      TRT->adjvex1 = TRT->adjvex2 = TRT->adjvex3 = -1;
      memset(TRT->data, 0, sizeof(char) * 50);

      //要赋值
        (*t)->TRT = TRT;
      return true;
}



        TIN * t;
        InitVTable(&t);

永恒的蓝色梦想 发表于 2020-11-9 13:00:21

main 呢?来个完整代码看看呗

冷回清风暖 发表于 2020-11-9 13:07:35

永恒的蓝色梦想 发表于 2020-11-9 13:00
main 呢?来个完整代码看看呗

int main(void)
{
        int flag;
        TIN* tin;
        InitVTable(&tin);
        return 0;
}

冷回清风暖 发表于 2020-11-9 13:09:44

xieglt 发表于 2020-11-9 10:43
先睹为快
你没有给他们赋值他们怎么会有值呢?

大概懂了
我改成这样试了下
tin->VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
就可以了。
不过不太清楚为什么原来这样不行
VNode* VT = tin->VT;
VT = (VNode*)malloc(sizeof(VNode));//初始化头结点

xieglt 发表于 2020-11-9 14:34:21

本帖最后由 xieglt 于 2020-11-9 14:42 编辑

冷回清风暖 发表于 2020-11-9 13:09
大概懂了
我改成这样试了下



VNode * VT ; 与 tin->VT;
它们都是一个指针变量,它们的值才是指针所指向的地址。

VNode* VT = tin->VT;
VT = (VNode*)malloc(sizeof(VNode));//初始化头结点

代码里tin->VT 没有初始化,有些编译器会自动将它的值初始化为0,有些编译器不会为之初始化。
因此,tin->VT的值可能为0,也有可能为未知内容。
VNode* VT = tin->VT;   
这一句执行后,把tin->VT 这个指针变量的值赋给了VT这个指针变量。
VT = (VNode*)malloc(sizeof(VNode));
这一句执行后,VT获得了一个新的值,但是tin->VT不会被改变

按你的意图,如果这样写就可以

VNODE ** VT;
VT = &(tin->VT);
*VT = (VNode*)malloc(sizeof(VNode));

胡鸣谦 发表于 2020-11-11 18:36:41

.

心驰神往 发表于 2020-11-12 08:38:30

已经放弃c了

weiter 发表于 2020-11-14 16:43:07

胡鸣谦 发表于 2020-11-11 18:36
.

你这个回复有一点点水……{:10_250:}

胡鸣谦 发表于 2020-11-14 16:46:55

weiter 发表于 2020-11-14 16:43
你这个回复有一点点水……

我是来赚鱼币的

15909574023 发表于 2020-11-14 17:00:21

{:10_269:}{:10_269:}{:10_269:}

15909574023 发表于 2020-11-14 17:00:51

{:10_269:}{:10_269:}

q789423 发表于 2020-11-14 18:31:16

感谢分享

学抓蟒蛇 发表于 2020-11-14 18:55:29

{:10_272:}

奋斗者4 发表于 2020-11-17 15:55:29

感谢分享!学习中

more_ 发表于 2020-12-31 10:51:37

前来学习

大聪明14 发表于 2021-1-1 16:48:36

前来学习
页: [1]
查看完整版本: 结构体malloc申请空间