C 结构体嵌套一级指针 二级指针 动态分配内存

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//结构体嵌套一级指针 二级指针 动态分配内存
typedef struct _Teacher {
	int age;
	int id;
	char *title;
	char **pStuarray;
	char name[64];

}Teacher;
//打印结构体
void printfTeacher(Teacher *array,int num) {
	int i = 0;
	for ( i = 0; i < num; i++)
	{
		printf("%d\n", array[i].age);
		printf("%s\n",array[i].pStuarray[i]);
	}

}
//给结构体分配内存
Teacher* createTarray(int num) {
	int i = 0,j=0;
	Teacher* teacher;
	teacher = (Teacher*)malloc(sizeof(Teacher)*num);
	if (teacher!=NULL)
	{
		for ( i = 0; i < num; i++)
		{
			teacher[i].title = (char*)malloc(sizeof(char)*100);//结构体Teacher title分配内存
			char** ptmp = (char**)malloc(sizeof(char*)*num);//
			for ( j = 0; j < num; j++)
			{
				ptmp[i] = (char*)malloc(100);//
			}
			teacher[i].pStuarray = ptmp;
		}
	}
	return teacher;
}
//释放内存
void freeTeacher(Teacher* arrayT,int num) {
	int i = 0,j=0;
	if (arrayT!=NULL)
	{
		for (i = 0; i < num;i++) {
			if (arrayT[i].title != NULL) {
				free(arrayT[i].title);
			}
			if (arrayT[i].pStuarray!=NULL)
			{
				for (j = 0; j < num; j++)
				{
					free(arrayT[i].pStuarray[j]);
				}
			}
			free(arrayT[i].pStuarray);
		}

		free(arrayT);
	}

}

void main() {
	int i = 0,j=0;
	Teacher *pArray=NULL;
	int num = 1;
	pArray = createTarray(num);

	for (i = 0; i < num; i++)
	{
		printf(" %d---age?\n", i + 1);
		scanf("%d", &pArray[i].age);
		printf(" %d---title?\n", i + 1);
		scanf("%s", pArray[i].title);
		printf(" %d---name?\n", i + 1);
		scanf("%s", pArray[i].name);

		for (j = 0; j < num; j++)
		{
			printf(" ---student----%d\n",i+1);
			scanf("%s", pArray[i].pStuarray[j]);
		}
	}
	printfTeacher(pArray,num);

	freeTeacher(pArray, num);
	system("pause");
}

时间: 2025-01-21 22:15:55

C 结构体嵌套一级指针 二级指针 动态分配内存的相关文章

黑马程序员---C基础12【结构体数组】【结构体指针】【结构体嵌套】【作为函数参数】【枚举类型】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [结构体数组] 1.结构体数组: 结构体数组的每一个元素都是具有相同结构类型的下标结构变量:(可以表示一个群体,一个班学生档案) 2.结构数组定义: 定义格式: struct    结构名{ 成员列表: }数组名[数组长度]: 1 1)定义结构体的同时定义数组: 2 3 struct stu{ 4 5 int num; 6 7 char name[10]; 8 9 int age; 10 11

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

C#调用C++ 平台调用P/Invoke 结构体--结构体嵌套【八】

普通的结构体嵌套很简单,C#中直接定义成对应的结构体即可,这里介绍的是嵌套的结构体以指针的方式表达 [1]嵌套结构体指针 C++代码: typedef struct _testStru10Pre { int iVal; }testStru10Pre; typedef struct _testStru10 { testStru10Pre *pPre; long lVal; _testStru10() { pPre = NULL; } }testStru10; EXPORTDLL_API void

结构体嵌套结构体名

转自:http://atu82.bokee.com/6706799.html 前一段时间在看DDK中例子的时候,看到这样的的结构体定义: typedef struct _COMMON_DEVICE_DATA { PDEVICE_OBJECT Self; BOOLEAN IsFDO; ...... } COMMON_DEVICE_DATA, *PCOMMON_DEVICE_DATA; typedef struct _PDO_DEVICE_DATA { COMMON_DEVICE_DATA; //

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

结构体嵌套

例如,结构体嵌套框架 typedef struct STD{     int chinese;     int math;     int english;     float average;}student; typedef struct NODE{     char name[10];     student std;     struct NODE *last;     struct NODE *next;}node;

仿函数--创建结构体或类的内部函数指针

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

c结构体里的数组与指针

/* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct foo { buf_str* pbuf; }; void test_funny() { foo f = {0}; printf("%x\n", f.pbuf); printf("%x\n", &f.pbuf->length); printf("%

非旋 treap 结构体数组版(无指针)详解,有图有真相

非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 所谓随机数维护平衡就是给每个节点一个随机值 key (下文中没有加随机的就代表是真实权值), 然后整棵树中 key 值要满足小(大)根堆的性质(也就是heap), 同时也要满足平衡树(tree)的性质(也就是每个节点左子树内节点真实