鱼C论坛

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

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

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

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

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

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

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

typedef struct Tri_VNode {
        int tadjvex;//三角形序号
        char data[50];//三角形名称
        int  adjvex1;//顶点1
        int  adjvex2;//顶点2
        int  adjvex3;//顶点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进行存储空间申请,但无法改变结构体中改部分的地址。
调试中各变量的地址如下
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不会被改变

按你的意图,如果这样写就可以
VNODE ** VT;
VT = &(tin->VT);
*VT = (VNode*)malloc(sizeof(VNode));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

本帖最后由 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

main 呢?来个完整代码看看呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 13:07:35 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-9 13:00
main 呢?来个完整代码看看呗
int main(void)
{
        int flag;
        TIN* tin;
        InitVTable(&tin);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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));//初始化头结点
想知道小甲鱼最近在做啥?请访问 -> 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不会被改变

按你的意图,如果这样写就可以
VNODE ** VT;
VT = &(tin->VT);
*VT = (VNode*)malloc(sizeof(VNode));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

已经放弃c了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币


你这个回复有一点点水……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是来赚鱼币的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-14 17:00:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +5 鱼币

感谢分享!学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

前来学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +5 鱼币

前来学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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