c語言中結構體在子函式中的用法
在c語言中,結構體是一種很常用的資料結構,但是要用好卻又有許多疑惑。
假設下面這個是我們要用到的結構體
typedef struct DATA data;
struct DATA{
int *A;
data *next;
data *last;
}
首先來看一下這兩個句子在子函式中的區別。
data * dt1=(data*)malloc(sizeof(data));
data* dt2;
讀者可能要說沒什麼區別,都一樣,但其實差別很大,用malloc申明的dt1,被放到堆記憶體中,當然堆也只是我們的定義,對記憶體本身來說並沒有這種意義,dt2被放到棧中,當退出子函式的時候就會被撤銷,這部分的記憶體值會是很隨機的。
因此如果你要用到的資料希望不隨子函式的結束而撤銷,那麼最好用malloc。
讀者或許又有疑問了
編譯器怎麼知道DATA的大小呢;
其實編譯器並不需要知道DATA的大小,或者說不管你DATA裡面有什麼資料結構,sizeof(dt1)都是一樣的。
那麼下面這兩句話又是否一樣呢;
sizeof(data);
sizeof(dt1);
讀者可能要說當然一樣啊,dt1就是data的例項啊,可是實際上並非如此。
首先我們知道一個指標的大小總是為4位元組,所以dt1的sizeof也總是4
而data結構體的sizeof則會根據內部的變數數量輸出大小。
好,現在又有一個新的問題,前面讀者知道了要在子函式中建立一個結構體例項,並希望在主函式中使用需要用malloc,但只是這樣就可以了嗎
答案也是否定的,我們的結構體中有用到很多int型的指標,他們所指的資料也必須是malloc出來的資料,否則他們所指的資料在出子函式之後也會是
奇奇怪怪的數字。
在結構體中為什麼不能建立另一個結構體變數而不是指標呢?
這個問題其實前面已經有暗示了,如果在結構體中用本結構體的變數,那麼相當於一個遞迴,編譯器永遠不會知道一個結構體的大小,或者說結構體大小無窮大。
而用本結構體指標,不管是什麼資料,反正你申明一個指標就是4位元組,這個編譯器還是沒問題的。
相關推薦
C語言 Struct 結構體在 Java 中的體現
修飾符 無法 輸入 更多 好用 ++ [] 的區別 import 大一整個學期完成了 C 語言的學習,大二就進入了Java 的學習。 和C語言一樣,我們都會嘗試寫一個小小的學生管理系統什麽的,學習過 C 語言同學知道,在管理系統中 Struct 結構體是個很好用的東
C語言,結構體中字串的宣告(採用字元指標還是字元陣列)
結構體中,字串選項是用字元陣列表示好,還是用字元指標表示好? typedef struct person{ char *name; int age; char sex[6]; } 該結構體中name用的是指標而不是陣列,所以需要給字串在堆上申
C語言:結構體中一級指標和二級指標的建立與釋放示例
這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者
c++中結構體作為函式引數的使用
結構體雖然和陣列一樣,都可以儲存多個數據項,但是在涉及到函式時,結構變數的行為更接近於一個基本的單值變數,也就是說,與陣列不同,結構將其資料組合成單個實體或資料物件,該實體被視為一個整體。函式中引數為
C語言:結構體中(.)和(->)的區別
一直以為這兩個是沒有什麼區別的,可以相互替換,今天又翻了一下《C語言核心技術》,明白了其中的奧妙。相同點:兩個都是二元操作符,其右操作符是成員的名稱。不同點:點操作符左邊的運算元是一個“結果為結構”的表示式; 箭頭操作符左邊的運算元是一個指向
C++ primer plus書之--C++函式和C語言字串, 結構體, string
函式和C風格字串 要將C風格字串作為引數傳遞給函式, 表示字串的方式有三種: 1.char陣列 2.用""擴起來的字串常量 3.被設定為字串地址的char指標 來看一個例子: // c風格字串例子 #include "iostream" using namespace std
【C 語言】結構體相關 的 函式 指標 陣列
.作者 : 萬境絕塵.結構體概述 : 結構體是 多個 變數的集合, 變數的型別可以不同;-- 可進行的操作 : 結構體可以進行 拷貝 賦值操作, 可以作為 函式引數 和 函式返回值;1. 結構體的基本使用結構體宣告 : struct 結構標記 {結構成員} 普通變數;-- 結
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語言】結構體
1.結構體 a.概念:結構是一些值得集合,這些值成為成員變數。結構的每個成員可以是不同型別的變數。 b.宣告: eg宣告一個學生資訊的結構體。 struct Stu { char name[20]; short int age;
C語言用結構體給另一個同類型結構體賦值: 用等號即可
看到很多C程式碼的結構體賦值都是用memcpy函式來拷貝,其實根本不需要,用等號直接賦值即可。結構體描述的是的一塊連續記憶體的記憶體佈局,同類型的一個結構體變數給另一個結構體變數賦值,使用等號編譯不會有任何問題,其效果顯然也和人直覺認為的一樣,拷貝對應記憶體。
[流暢的 C]C語言將結構體轉化為字串
[流暢的 C] C語言將結構體轉化為字串 Overview 思路 直接使用 memcpy 之類的是不可以的。所以最好的做法就是定義結構體的時候就實現對字串的轉換。 就像 Python 的 __str__ 一樣。 (不好意思,博主雷打不動轉python!信仰
C語言入門-結構體
查詢學生成績: #include <stdio.h> #include <string.h>//用字串中的strlen,strcmp,strcpy等需要標頭檔案 #define N 2 void input(char no[ ][11],ch
1-C語言之結構體、共用體、列舉
一、關鍵字說明 C語言有32個關鍵字,C語言通過關鍵字的使用使編譯器進行相關的操作 結構體對應關鍵字struct 共用體(聯合體)對應的關鍵字是union 列舉型別對應的關鍵字是enum 二、結構
C語言的結構體和java的類異同
結構體跟類的概念確實有點像,尤其是跟C++中的類。先說相同點:(1)結構體和類都可以實現對於資料的封裝,比如將一輛車定義為由多個部分組成,如車身、車輪、車燈等。(2)結構體和類都是可以巢狀的,比如C/C++ code?12345struct A{struct B{int a;
黑馬程式設計師——C語言基礎——結構體相關練習
今天整理了C語言基礎學習過程中對結構體的一些知識,下面是程式碼片段: #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { //定義