结构体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 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);
main 呢?来个完整代码看看呗 永恒的蓝色梦想 发表于 2020-11-9 13:00
main 呢?来个完整代码看看呗
int main(void)
{
int flag;
TIN* tin;
InitVTable(&tin);
return 0;
} 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: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));
. 已经放弃c了 胡鸣谦 发表于 2020-11-11 18:36
.
你这个回复有一点点水……{:10_250:} weiter 发表于 2020-11-14 16:43
你这个回复有一点点水……
我是来赚鱼币的 {:10_269:}{:10_269:}{:10_269:} {:10_269:}{:10_269:} 感谢分享 {:10_272:} 感谢分享!学习中 前来学习 前来学习
页:
[1]