1. 程式人生 > >C\C++中結構體變數與結構體指標記憶體分配問題

C\C++中結構體變數與結構體指標記憶體分配問題

宣告一個結構體變數,無論是否初始化,都開闢記憶體,宣告一個結構體指標變數,對其初始化的時候才會開闢記憶體。

A a[3];  a是A型的,有3個,當然分配A乘3大小的空間

A* a;    a是A*型的,當然只分配A*大小的空間,而不會分配A大小的空間

好像跟你說的不太一樣,結構體陣列的話,我在課本里看到的確不用再次申請空間了啊[/quote]

結構體變數分配結構體本身大小的空間,結構體指標分配4個位元組,其實任何型別的指標都是分配四個位元組的指標空間。
所以:
A a[3]; //a裡面是三個A變數,所以分配三個結構體大小
A *a;  //a是一個指標,分配4個位元組,就算A再大,a也只是4個位元組,因為任何型別的指標都是4個位元組。要使用a,必須先要對指標初始化,也即分配空間了。

如:
A *a;
a = (A*)malloc(sizeof(A));

我們完全可以撇開結構體,把問題簡單化成int型別來說明這個指標問題:
int a1[10];
int *a2;

很容易知道,a1是包含10個int的陣列,大小也就是10*sizeof(int)。我們可以直接使用a1不要在進行什麼初始化或者分配空間的遊戲,因為陣列a1裡面本身存放的就是int變數本身了。

然後a2,是一個int*的東西,也就是整型指標,a2不能存放int變數,它只能存放地址,一個int變數的地址。如果要使用a2,必須首先對a2初始化,即將它指向一個int變數的地址,如:
a2 = (int*)malloc(sizeof(int));

或者
int i = 10;
a2 = &i;
所以,malloc函式的作用是首先宣告一個變數,然後返回該變數的地址。
所以:a2 = (int*)malloc(sizeof(int)) 的含義就是把該變數的地址賦值給a2,和a = &i 本質上並沒有什麼不同,只是一個變數是棧上,一個是堆上,都是一個地址賦值。

所以,所謂的分配空間,就是對指標賦值,把一個變數的地址賦值給一個指標。

相關推薦

C\C++結構變數結構指標記憶體分配問題

宣告一個結構體變數,無論是否初始化,都開闢記憶體,宣告一個結構體指標變數,對其初始化的時候才會開闢記憶體。 A a[3];  a是A型的,有3個,當然分配A乘3大小的空間 A* a;    a是A*型的,當然只分配A*大小的空間,而不會分配A大小的空間好像跟你說的不太一樣,

c語言的全域性變數區域性變數

全域性變數 在函式外面定義的變數,可以為本檔案中其他函式所公用,他的有效範圍為定義的位置開始一直到本原始檔結束,即main函式結束。 區域性變數和外部變數同名時,在區域性變數的範圍內,外部變數不起作用。 全域性變數的儲存方式:一般來說全域性變數都是存放在靜態儲存

C語言物件的點箭頭(指標)的區別

在c++中I如果是物件,就可以通過"."來呼叫I中的成員變數。如果I是指標的話,就不能通過"."來呼叫,而只能使用"->"來呼叫。在C語言中不存在物件的概念。這種情況的出現是因為使用了結構,例如struct CandyBar{float weight;int calo

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

C語言 一個例子說明結構變數結構陣列和結構指標

輸入三個學生的個人資訊 包含學號 姓名和三門學科的成績 輸出平均成績最高的學生的學號 姓名 各科成績以及平均成績 程式碼如下(譚浩強c程式設計的例子) #include<stdio.h> struct Student {int num;

C++開發EOS基礎指南之類結構

namespace pri 銷毀 默認構造函數 cti 對象 成員函數 初始化 析構 C++是一種面向對象的編程語言。它有一個強大的繼承系統,私有和公共成員變量,以及通過成員初始化列表在構造函數中初始化它們的好方法。析構函數是構造函數的附件,允許你在對象被銷毀或超出範圍時運

C語言的三種迴圈結構及其注意點

三種迴圈結構:  1)for ( ); while( ); do- while()三種。  2)for迴圈當中必須是兩個分號,千萬不要忘記。  3)寫程式的時候一定要注意,迴圈一定要有結束的條件,否則成了死迴圈。  4) do-while()迴圈的最後一個while();的分號一定不能夠丟。       do

結構指標變數結構成員指標變數

C程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{    char *name;    int score;  

C#誰最快:結構還是類?

前言 在記憶體當道的日子裡,無論什麼時候都要考慮這些程式碼是否會影響程式效能呢? 在現在的世界裡,幾乎不會去考慮用了幾百毫秒,可是在特別的場景了,往往這幾百毫米確影響了整個專案的快慢。 通過了解這兩者之間的效能差異,希望幫助大家在合適的場景裡選擇正確的編碼。 例項 public class PointCl

C語言的強符號弱符號

_weak 多個 obj china 很難 字節 whole sta dump 註意,強符號和弱符號都是針對定義來說的,不是針對符號的引用。 一、概述 在C語言中,函數和初始化的全局變量(包括顯示初始化為0)是強符號,未初始化的全局變量是弱符號。 對於它們,下列三條規則使用

random無法在C語言使用,randsrand種子

標題rand與srand之間的分析 1. 關於隨機數的使用: 下面我寫了一個簡單的數學題聯絡軟體: 程式碼如下: #include <stdio.h> #include "stdlib.h" int main(){ int a, b ,c; char d; whi

有關C++類資料成員變數定義的一些想法

最近開始學習C++,以前是學C的,對C++新生的類不是很懂,最近在看一些教程,發現有的教程只是簡單的告訴你什麼是類,還有怎麼使用類,但對於類的標準啥的並沒有進行標準化的介紹。 關於C++類中成員變數的定義,一般都是推薦這樣定義: 1.類中的屬性(不是函式)最好定義標準化,並且取名字能讓其

C語言一維陣列二維陣列

int arr [4]  //定義了一個一維陣列,長度為4;說明以下三個分別是什麼型別; (1)arr //型別為int *,表示陣列元素首地址,即圖中箭頭指向的位置。 (2)arr+1 //型別為int *,表示陣列元素首地址+1,即圖中箭頭指向的位置。 (3)arr [0

C++併發的條件變數 std::condition_variable

簡介 這個操作相當於作業系統中的Wait & Signal原語,程式中的執行緒根據實際情況,將自己阻塞或者喚醒其他阻塞的執行緒。 個人認為,條件變數的作用在於控制執行緒的阻塞和喚醒,這需要和鎖進行相互配合,用來實現併發程式的控制。 函式操作 wait和notify

C++類的靜態成員靜態方法

C++中,若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為例項方法。靜態方法為類所有,可以通過物件來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的例項就可使用。靜態方法只能呼叫靜態變數。 呼叫方式

C++STLvector容器 begin()end()函式、front()back()

begin函式: 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 end函式: 函式原型: iterator end(); const_iterat

C語言中static全域性變數普通的全域性變數區別

下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ?   全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。   全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上

C\C++程式設計:相對路徑絕對路徑

在程式設計的過程中,會遇到需要引用外部檔案的情況,有兩種路徑的書寫方式,通過下面的列子進行分析。 電腦硬碟E盤下,建資料夾“test”,"test"下建立子資料夾“file”,"file"下建子資料夾“data”,電腦資源管理器顯示目錄 E:\test\fi

C++語言的外部變數引用和char[],char*的若干問題探究

今天覆習了一下C++的知識點,發現了一些有疑問的地方,查看了一些資料,得到一些結論,記錄下來。1,如果在一個工程目錄下,存在多個頭檔案,這些標頭檔案裡面是否可以包含相同的變數名呢?思考:標頭檔案給我們的資訊其實就是介面資訊,我們呼叫一個頭檔案其實就是呼叫跟它相關的原始檔,原始

[C++]STLvector容器 begin()end()函式、front()back()的用法

    本部落格轉自http://blog.csdn.net/duan19920101/article/details/51679517 一、begin函式 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當