鱼C论坛

 找回密码
 立即注册
查看: 3119|回复: 16

[已解决]结构体malloc申请空间

[复制链接]
回帖奖励 40 鱼币 回复本帖可获得 5 鱼币奖励! 每人限 1 次
发表于 2020-11-9 10:39:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已经自己调了一天了,没搞懂为什么 ,所以来寻求大家的帮助了。
先附上代码
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #include<string.h>

  5. typedef struct VNode{
  6.         int adjvex;//顶点序号
  7.         char data[50];//顶点名称
  8.         double x, y, z;//顶点的三维坐标
  9.         struct VNode* next;//指向下一个顶点的指针
  10. }VNode,*VTable;//顶点表

  11. typedef struct Tri_VNode {
  12.         int tadjvex;//三角形序号
  13.         char data[50];//三角形名称
  14.         int  adjvex1;//顶点1
  15.         int  adjvex2;//顶点2
  16.         int  adjvex3;//顶点3
  17.         struct Tri_VNode* next;//指向下一个三角形的指针
  18. }Tri_VNode,*TriVTable;//三角形表

  19. typedef struct {
  20.         VTable VT;
  21.         TriVTable TRT;
  22.         int vexnum, trinum;//顶点数,三角形个数
  23. }TIN;

  24. bool InitVTable(TIN** t) {
  25.         *t = (TIN*)malloc(sizeof(TIN));
  26.         TIN* tin = *t;
  27.         tin->trinum = tin->vexnum = 0;//初始化顶点个数及三角形个数
  28.         //初始化顶点表
  29.         VNode* VT = tin->VT;
  30.         VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
  31.         if (!VT) return false;
  32.         VT->next = NULL;
  33.         VT->adjvex = -1;
  34.         VT->x = VT->y = VT->z = -1;
  35.         memset(VT->data, 0, sizeof(char) * 50);
  36.         //初始化三角形表
  37.     Tri_VNode* TRT = tin->TRT;
  38.         TRT = (TriVTable)malloc(sizeof(Tri_VNode));
  39.         if (!TRT) return false;
  40.         TRT->next = NULL;
  41.         TRT->tadjvex = -1;
  42.         TRT->adjvex1 = TRT->adjvex2 = TRT->adjvex3 = -1;
  43.         memset(TRT->data, 0, sizeof(char) * 50);
  44.         return true;
  45. }
复制代码
  1. *t = (TIN*)malloc(sizeof(TIN));
复制代码
利用该语句对TIN结构体进行赋值,但是发现VTable和TriVTable没有获得地址。
于是采用
  1. VNode* VT = tin->VT;
  2.         VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
复制代码

这种方式尝试为TIN 结构体中的VTable进行存储空间申请,但无法改变结构体中改部分的地址。
调试中各变量的地址如下
EGA%4Q3_ZK2{E)_LF73CD}A.png
最佳答案
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不会被改变

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

  1. VNODE ** VT;
  2. VT = &(tin->VT);
  3. *VT = (VNode*)malloc(sizeof(VNode));
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-9 10:43:08 | 显示全部楼层

回帖奖励 +5 鱼币

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

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

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

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

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

  24.         //要赋值
  25.         (*t)->TRT = TRT;
  26.         return true;
  27. }
复制代码


  1.         TIN * t;
  2.         InitVTable(&t);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-9 13:00:21 | 显示全部楼层

回帖奖励 +5 鱼币

main 呢?来个完整代码看看呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 13:07:35 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-9 13:00
main 呢?来个完整代码看看呗
  1. int main(void)
  2. {
  3.         int flag;
  4.         TIN* tin;
  5.         InitVTable(&tin);
  6.         return 0;
  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 13:09:44 | 显示全部楼层
xieglt 发表于 2020-11-9 10:43
先睹为快
你没有给他们赋值他们怎么会有值呢?

大概懂了
我改成这样试了下
  1. tin->VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
复制代码

就可以了。
不过不太清楚为什么原来这样不行
  1. VNode* VT = tin->VT;
  2. VT = (VNode*)malloc(sizeof(VNode));//初始化头结点
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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不会被改变

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

  1. VNODE ** VT;
  2. VT = &(tin->VT);
  3. *VT = (VNode*)malloc(sizeof(VNode));
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 18:36:41 | 显示全部楼层

回帖奖励 +5 鱼币

.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-12 08:38:30 | 显示全部楼层

回帖奖励 +5 鱼币

已经放弃c了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 16:43:07 | 显示全部楼层

回帖奖励 +5 鱼币


你这个回复有一点点水……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 16:46:55 | 显示全部楼层
weiter 发表于 2020-11-14 16:43
你这个回复有一点点水……

我是来赚鱼币的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 17:00:21 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-14 17:00:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-14 18:31:16 | 显示全部楼层

回帖奖励 +5 鱼币

感谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 18:55:29 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-17 15:55:29 | 显示全部楼层

回帖奖励 +5 鱼币

感谢分享!学习中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 10:51:37 | 显示全部楼层

回帖奖励 +5 鱼币

前来学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-1 16:48:36 | 显示全部楼层

回帖奖励 +5 鱼币

前来学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-3 16:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表