C 中陣列的初始化分配記憶體的大小

發布 科技 2024-06-08
9個回答
  1. 匿名使用者2024-01-29

    事實上,你的程式的執行結果並不是唯一的,在不同的編譯器上,結果可能會有所不同!

    問題在於,所有字串陣列最終都不會以終止符結尾'\0',strlen(),函式根據它計算字串的長度'\0'以確定字串的末尾。

    所以你沒有給'\0',因此結果完全取決於記憶體的分配(例如,strlen(c),從 c 的位址開始,當有乙個值 0x00 時,即'\0'--,計算完長度,返回結果,這個結果不知道是什麼,呵呵)。

    更正:將陣列定義更改為:

    char c[4] = ;定義了 4 個元素,應該給所有人!

    char t = ;

    char t2 = ;

    就是這樣。

  2. 匿名使用者2024-01-28

    最好這樣改變它。

    #include

    #include

    #include

    using namespace std;

    void put(string s);

    int main()

    char c[4] = "tao";*字串的初始值 * char t ="tao";

    char t2 = "taozhi";

    cout cout #include

    #include

    #include

    using namespace std;

    void put(string s);

    int main()

    char c[4] = ;*這裡編譯器會自動初始化 c[3]0,所以長度是正確的*

    char t = ;* 等價於 t[3],不帶字串終止符,與 * char t2 = 相同;

    cout cout

  3. 匿名使用者2024-01-27

    C 語言使用的記憶體是虛擬記憶體。 根據功能的不同,虛擬記憶體在C語言中分為堆疊、堆和靜態資料區三類,無論是單個變數還是陣列,記憶體分配都是這樣劃分的。

    在堆疊、靜態資料區和堆區,編譯器負責分配,作業系統負責管理,程式設計師可以在堆中使用malloc()動態分配堆記憶體。

  4. 匿名使用者2024-01-26

    C 語言中有三種型別的記憶體:堆疊、堆和靜態資料。

    區域性變數分配在堆疊上,函式呼叫前的堆疊指標應與函式返回後的堆疊指標相同,否則會發生錯誤。

    void test(void)

    char i,a[10];

    printf("0x%x", i);

    printf("0x%x", a);

    printf("0x%x", a+1);

    printf("0x%x", a+2);

    printf("0x%x", a+3);

  5. 匿名使用者2024-01-25

    整數陣列的每個元素都連續儲存在記憶體中,每個整數元素的儲存方式取決於計算機硬體。

    1. 陣列元素連續儲存,位址從低到高。

    例如,字元陣列 char a[10];

    有 10 個元素,從 a[0] 到 a[9],位址是連續的。 如果 A 的起始位址是 0x1234,則後續位址是 0x1235、0x1235 等0x123d。

    2.每個元素的具體儲存方式取決於CPU。 有兩種:

    1. 小端序:

    低序列位元組儲存在起始位址(低階定址),位址的低位儲存在值的低位,位址的高位儲存在值的高點。

    目前大多數 CPU 都以這種方式儲存,包括 Intel 和移動裝置上最常見的 ARM。

    例如,如果 4 位元組整數值0x12345678,它將在記憶體中儲存為:

    0x78 0x56 0x34 0x12

    2.大端序:

    與 little-endian 相比,高序位元組儲存在起始位址(高階定址),位址低位儲存值的高位,位址高位儲存值的低位。

    前面的示例在 big-endian 情況下儲存為:

    0x12 0x34 0x56 0x78

  6. 匿名使用者2024-01-24

    每個數字占用 4 個位元組,位址從低到高,下標為 0 的元素在前,下標為 1 的元素後......依此類推,沒有間隔,直到整個陣列的末尾。

  7. 匿名使用者2024-01-23

    realloc 呼叫<>需要兩個引數。

    此外,需要先檢測函式返回的結果,然後才能使用。 如果 realloc 無法申請記憶體,則返回 null

  8. 匿名使用者2024-01-22

    為什麼一定要用realloc,用你很熟悉的malloc或者calloc不是很香嗎?

  9. 匿名使用者2024-01-21

    這說起來有點麻煩,我以前也做過類似的事情,用手打起來並不容易。

    首先,您需要將陣列定義為記憶體堆。

    其次,上面定義的陣列是分頁的,例如,每頁大4個位元組的位元組,記錄每一頁的位址,可以定義非常大,管理這些記憶體所需的記憶體越大,但也容易造成記憶體利用率不足。

    3.經過上面的分組,我們可以定義乙個結構,它大致包含記憶體頁碼、是否被使用過,以及記憶體分配的唯一識別符號(用於區分哪個記憶體是同乙個分配的記憶體)。

    第四,這時可以編寫動態記憶體分配函式,根據分配的大小,查詢未使用的連續記憶體頁。 例如,在第二步中,將乙個頁面定義為 4 個位元組,需要 5 個位元組的記憶體,因此分配了兩個頁面(額外的 3 個位元組將毫無用處,並且會被浪費)。 找到記憶體頁後,將多個記憶體頁標記為已使用,為多個記憶體頁分配相同的記憶體分配識別符號,然後返回第一頁的位址。

    5.釋放記憶體,根據記憶體分配的唯一識別符號找到幾個記憶體頁,並標記為未使用。

相關回答
10個回答2024-06-08

這些是您絕對應該了解的基本概念:

char a[12];定義了乙個字元陣列,陣列名稱是 a,在本例中,a 是指標,它是乙個常量型別,其值在陣列的整個生命週期內是不可變的。 >>>More

18個回答2024-06-08

mytest->b[2] = ;

這種用大括號括起來的初始化列表形式的初始化只適用於宣告和初始化時,並且只對 pod 型別有效。 >>>More

7個回答2024-06-08

物件的初始化是否通常用於初始化列表?

建構函式通常用於物件的初始化。 >>>More

6個回答2024-06-08

靜態成員初始化只能在類外部全域性完成,不能在類中完成。 >>>More

4個回答2024-06-08

這取決於它的儲存方式。

1.在“二補”模式下,10的40次方小於2的133次方,即133位或不超過17位元組,可以儲存。 >>>More