1. 程式人生 > >C語言:結構體中一級指標和二級指標的建立與釋放示例

C語言:結構體中一級指標和二級指標的建立與釋放示例

這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。

今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者敲程式碼過程中也是有bug出現的,經過除錯也找到了bug所在,不得不說,鞏固也是很重要的。而結構體作為C語言一部分也是很重要的,指標作為C語言的半壁江山也保持著其重要地位。程式碼不是很長,但裡面有很多細節的考慮,特別是一級指標和二級指標的記憶體的申請和釋放。

程式碼的主要表達是:有三個老師,每個老師都有屬性名字,年齡,別名,編號,以及有三個學生名字。老師名字(name)的記憶體分配是在棧區,別名(alisname)和學生名(stuname)的記憶體分配是在堆區。個人認為C語言的記憶體四區(棧區,堆區,全域性區,程式碼區)很重要,所以喜歡從記憶體四區的角度看程式碼,對理解C語言的本質是重要,也是理解bug所在的重要原因。

下面是示例程式碼:


// 結構體 示例
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct Teacher // 定義一個結構體,名稱為Teacher
{
	char name[64];
	int age;
	char *alisname;//別名
	char **stuname;
	int id;
}Teacher;

int createTeacher(Teacher **pT, int num)
{
	int i = 0;
	int j = 0;
	int ret = 0;
	Teacher *tmp = NULL;

	tmp = (Teacher *)malloc(num * sizeof(Teacher));
	if (tmp == NULL)
	{
		ret = -1;
		printf("malloc err: %d\n",ret);
		return ret;
	}
	memset(tmp, 0, num * sizeof(Teacher));

	for (i = 0; i < num; i++)
	{
		char **myp = NULL;
		
		//先建立一級指標
		tmp[i].alisname = (char *)malloc(60);
		if ( tmp[i].alisname == NULL)
		{
			ret = -2;
			printf("malloc tmp[i].alisname err: %d\n",ret);
			return ret;
		}

		//再建立二級指標
		myp = (char **)malloc(3 * sizeof(char *));
		if (myp == NULL)
		{
			ret = -3;
			return ret;
		}
		for (j = 0; j < 3; j++)
		{
			myp[j] = (char *)malloc(60);
			if (myp[j] == NULL)
			{
				ret = -4;
				return ret;
			}
		}
		tmp[i].stuname = myp;
	}

	*pT = tmp;
	return ret;
}

int printTeacherandStu(Teacher *p, int num)
{
	int i = 0;
	int j = 0;
	int ret = 0;
	Teacher *tmp = NULL;

	if (p == NULL)
	{
		ret = -1;
		printf("p is null : %d\n",ret);
		return ret;
	}
	tmp = p;

	for (i = 0; i < num; i++)
	{
		char **myp = NULL;
		
		printf("teacher name: %s\n",tmp[i].name);
		printf(" teacher alisname: %s\n",tmp[i].alisname);

		printf("  student's name:  ");
		myp = tmp[i].stuname;
		for (j = 0; j < 3; j++)
		{
			printf("%s  ",myp[j]);
		}
		printf("\n");	
	}
	return ret;

}

void FreeTeacher(Teacher *p, int num)
{
	int i = 0;
	int j = 0;
	Teacher *tmp = NULL;

	tmp = p;

	for(i = 0; i < num; i++)
	{
		char **myp = NULL;
		//先釋放以及指標
		if (tmp[i].alisname != NULL)
		{
			free(tmp[i].alisname);
		}

		//再釋放二級指標
		if (tmp[i].stuname != NULL)
		{
			myp = tmp[i].stuname;
			for (j = 0; j < 3; j++)
			{
				if (myp[j] != NULL)
				{
					free(myp[j]);
				}
			}
			free(myp);
			tmp[i].stuname = NULL;
		}	
	}
	free(tmp);
}

int main()
{
	int ret = 0;
	int i = 0;
	int j = 0;
	int num = 3;
	Teacher *pArray = NULL;

	ret = createTeacher(&pArray, num);
	if (ret != 0)
	{
		printf("func createTeacher() err: %d\n",ret);
		return ret;
	}

	for (i = 0; i < num; i++)
	{
		printf("\nplease input teacher's name:");
		scanf("%s",pArray[i].name);

		printf("\n please input teacher's age:");
		scanf("%d",&(pArray[i].age));

		printf("\n please input teacher's alsname:");
		scanf("%s",pArray[i].alisname);

		for (j = 0; j < 3; j++)
		{
			printf("\n  please input student name:");
			scanf("%s",pArray[i].stuname[j]);
		}
	}

	ret = printTeacherandStu(pArray, num);
	if (ret != 0)
	{
		ret = -2;
		printf("func printTeacherandStu() err: %d\n",ret);
		return ret;
	}

	FreeTeacher(pArray, num);
	return 0;
}


具體詳細細節就不討論了,不懂的可以問,下面是執行結果:



相關推薦

C語言結構一級指標二級指標建立釋放示例

這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者

C語言結構(.)(->)的區別

一直以為這兩個是沒有什麼區別的,可以相互替換,今天又翻了一下《C語言核心技術》,明白了其中的奧妙。相同點:兩個都是二元操作符,其右操作符是成員的名稱。不同點:點操作符左邊的運算元是一個“結果為結構”的表示式;                箭頭操作符左邊的運算元是一個指向

C語言結構字串的宣告(採用字元指標還是字元陣列)

      結構體中,字串選項是用字元陣列表示好,還是用字元指標表示好? typedef struct person{ char *name; int age; char sex[6]; }       該結構體中name用的是指標而不是陣列,所以需要給字串在堆上申

C語言結構巢狀一級指標二級指標

指標是C語言的精華,也是c中最難的部分;為了鍛鍊和提高自己對指標的理解,特在結構體中巢狀一級指標和二級指標來加深對。 #include<stdio.h> #include <string.h> #include<stdlib.h&

C語言 Struct 結構在 Java 的體現

修飾符 無法 輸入 更多 好用 ++ [] 的區別 import   大一整個學期完成了 C 語言的學習,大二就進入了Java 的學習。   和C語言一樣,我們都會嘗試寫一個小小的學生管理系統什麽的,學習過 C 語言同學知道,在管理系統中 Struct 結構體是個很好用的東

C語言結構包含指向自己的指標

執行環境:VC6.0 例子程式:tets.c ************************************************************************************************* #include <stdio.h> struct x

c語言指向結構陣列的指標

 c指標變數可以指向一個結構陣列,這時結構指標變數的值是整個結構陣列的首地址。結構指標變數也可指向結構陣列的一個元素,這時結構指標變數的值是該結構陣列元素的首地址。設ps為指向結構陣列的指標變數,則ps也指向該結構陣列的0號元素,ps+1指向1號元素,ps+i則指向i號

C 語言通過結構成員獲得結構指標

通過結構體成員拿到結構體的指標,是C語言實現繼承多型的基礎。面向物件C程式設計可以參看這裡OOC 面向物件C語言程式設計實踐。這裡詳細介紹這個核心的操作方法。 /** * Get struct pointer from member pointer */ #defin

C 語言結構相關 的 函式 指標 陣列

.作者 : 萬境絕塵.結構體概述 : 結構體是 多個 變數的集合, 變數的型別可以不同;-- 可進行的操作 : 結構體可以進行 拷貝 賦值操作, 可以作為 函式引數 和 函式返回值;1. 結構體的基本使用結構體宣告 : struct 結構標記 {結構成員} 普通變數;-- 結

c語言一級指標二級指標作為函式引數,連結串列,malloc的分配等等總結

主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是地址的地址; 如: int a=

C語言複習 -- 結構指標自增運算子

測試程式碼: #include <stdio.h> #include <stdlib.h> int main() {  struct student {   char *name;   int score;  };  struct stud

C 語言結構

ons nbsp span clas %d str style ret [] 1 #include <stdio.h> 2 3 #include <struct.h> 4 5 #include <string.h>

11、C語言結構共用

結構體數組 結構體 float add font sco 規則 student mon 一、結構體   結構體:是一種自定義的構造數據類型   用途:把不同類型的數據組合成一個整體。     結構體類型定義:     struct [結構體名]    {       類型識

C語言小結--結構

1 什麼是結構體 結構體是一種聚合資料型別,它是一種資料元素的聚合。比如我們描述一個學生時,要求有他的姓名、學校、分數等等資訊,在之前的處理中,我們通常會使用單獨的資料型別來描述。比如,定義一個字串陣列來描述姓名char name[20] = "xiaoming",定義一個浮點數來描

C語言結構詳解(轉載只是為了查閱方便,若有侵權立刪)

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

C語言結構 共用 列舉 typedef

結構體型別和結構體變數, struct 定義結構體型別時 不佔記憶體 匿名結構體,無法建立變數訪問,有限的結構體型別變數 結構體變數不能整體引用,只能引用變數成員 結構體變數用大括號賦值,只有在建立並初始化的時候才可以 #define _CRT_SECURE_NO_WARN

C語言結構、列舉型別、型別定義)

結構體的定義 1、`struct 結構體名 { 成員型別 成員名; … }; 2、省略結構體名 struct { 成員型別 成員名; ... }結構體變數名; 成員可以是其他已定義結構體的型別,但不能是自己結構體的型別,可以是自己結構體的指標。 定義

C++ primer plus書之--C++函式C語言字串, 結構, string

函式和C風格字串 要將C風格字串作為引數傳遞給函式, 表示字串的方式有三種: 1.char陣列 2.用""擴起來的字串常量 3.被設定為字串地址的char指標 來看一個例子: // c風格字串例子 #include "iostream" using namespace std

go語言結構json串的互相轉換

將結構體轉為json串 package main import ( "encoding/json" "fmt" ) type Person struct { // 這裡的兩個欄位名,首字母都要大寫,否則無法轉換 Name string `

C語言結構

1.結構體 a.概念:結構是一些值得集合,這些值成為成員變數。結構的每個成員可以是不同型別的變數。 b.宣告: eg宣告一個學生資訊的結構體。 struct Stu { char name[20]; short int age;