簡體   English   中英

C程序:當我使用malloc函數時,我發現總是有更多的字節而不是數組的大小

[英]C program: when I use malloc function, I find that there are always more bytes than size of the array

也許新代碼可以解釋我的意思。

#include <stdio.h>
#include <stdlib.h>
int main(void){
    int i_size = 2, j_size = 5, k_size = 5, l_size = 6, m_size = 6;
    int i = 0, j = 0, k = 0, l = 0, m = 0; 
    printf("ptr1\n");
    int** ptr1 = (int**) malloc(sizeof(int*) * i_size);
    for(i = 0; i < i_size; i++){
        printf("%d\n", ptr1 + i);
    }
    printf("ptr2\n");
    int** ptr2 =  (int**) malloc(sizeof(int*) * j_size);
    for(j = 0; j < j_size; j++){
        printf("%d\n", ptr2 + j);
    }
    printf("ptr3\n");
    int** ptr3 =  (int**) malloc(sizeof(int*) * k_size);
    for(k = 0; k < k_size; k++){
        printf("%d\n", ptr3 + k);
    }
    printf("ptr4\n");
    int** ptr4 =  (int**) malloc(sizeof(int*) * l_size);
    for(l = 0; l < l_size; l++){
        printf("%d\n", ptr4 + l);
    }
    printf("ptr5\n");
    int** ptr5 =  (int**) malloc(sizeof(int*) * m_size);
    for(m = 0; m < m_size; m++){
         printf("%d\n", ptr5 + m);
    }
    free(ptr1);
    free(ptr2);
    free(ptr3);
    free(ptr4);
    free(ptr5); 
    return 0;
}

結果如下:

結果

有趣的是,對於malloc函數來說,數組的最小大小是32字節。 操作系統似乎保留了8個字節的空間,因為當我發現l_size ,它有64個字節。 這意味着如果你想要一個48字節的數組malloc,操作系統將分配超過48字節的空間。

更新以上

=====

我的代碼如下所示:

#include <stdio.h>
#include <stdlib.h>
int main(void){
    int i_size = 5, j_size = 6, i = 0, j = 0; 
    printf("Addresses of two dimensional pointer\n");
    int** ptr = (int**) malloc(sizeof(int*) * i_size);
    printf("%d:\t%d\n", &ptr, ptr);
    for(i = 0; i < i_size; i++){
        *(ptr + i) = (int*) malloc(sizeof(int) * j_size);
    }
    for(i = 0; i < i_size; i++){
        for(j = 0; j < j_size; j++){
            *(*(ptr+i) + j) = i * 2 + j;
        }
    }
    for(i = 0; i < i_size; i++){
        printf("%d:\t%d\n", ptr + i, *(ptr + i));
    }
    printf("==\n");
    for(i = 0; i < i_size; i++){
        for(j = 0; j < j_size; j++){
            printf("%d:\t%d\t%d\n",*(ptr + i) + j, *(*(ptr + i) + j), ptr[i][j]);
        }
        printf("==\n");
    }
    for(i = 0; i < i_size; i++){
        free(*(ptr + i));
    } 
    free(ptr);

    return 0; 
}

結果如下圖所示:

在此輸入圖像描述

代碼在Windows 10,64位上運行,並使用Dev C ++的TDM-GCC4.9.2進行編譯。

我被紅色塊弄糊塗了。 為什么總是比數組大小多8個字節。 如果我將i_size的值更改為6,則OS似乎將給ptr 64字節而不是48。

將i_size的值更改為6的結果

我希望值12021664應該是12021648 如果我將i_size的值更改為7,則可以: 將i_size的值更改為7的結果

但是當i_size值為8時,我預計值10710960應為10710944 但它不起作用。

將i_size的值更改為8的結果

ptr指向int *的數組。 在您的系統上,指針的大小似乎是8個字節,因此數組的每個成員都是8個字節。

然后,當您將每個成員的地址打印為ptr + i ,您會看到它們各自相差8。

此外,您應該使用%p來打印指針而不是%d 使用錯誤的格式說明符調用未定義的行為

關於malloc返回的特定內存地址,這些是庫的實現細節。 不要求連續分配在內存中應該相鄰。 實際上,它們不相鄰是有意義的,因為可能有一些元數據存儲在malloc內部使用的那些中間地址中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM