Почему malloc выделяет количество байтов, отличное от запрошенного? - PullRequest
7 голосов
/ 10 января 2009

У меня есть этот кусок кода

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int main(){
    void *a, *b;

    a = malloc(16);
    b = malloc(16);
    printf("\n   block size (for a): %p-%p : %li", b, a, b-a);

    a = malloc(1024);
    b = malloc(1024);
    printf("\n   block size (for a): %p-%p : %li", b, a, b-a);  
}

Разве это не должно печатать последний выделенный размер блока (16 или 1024)? Вместо этого он печатает 24 и 1032, поэтому объем выделенной памяти, кажется, имеет 8 дополнительных байтов.

Моя проблема (до создания этого контрольного примера) в том, что я делаю malloc() в функции (1024 байта) и возвращаю выделенный результат. При проверке размера блока при возврате функции я получаю 516 блоков ... и я не понимаю, почему. Я предполагаю, что это может быть причиной повреждения памяти, которое происходит после некоторой обработки выделенных буферов:)

Редактировать: Я видел Как я могу получить размер массива из указателя в C? и, кажется, просит то же самое, извините за перепост. *

Я переделал мой пример в мой более конкретный код:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

short int * mallocStuff(long int number, short int base){
    short int *array;
    int size=1024;

    array=(short int*)calloc(1,size);
    //array=(short int*)malloc(size);

    return array;
}

int main(){
    short int **translatedArray;

    translatedArray=malloc(4*sizeof(short int));

    int i;
    for(i=0;i<4;i++){
        translatedArray[i]=mallocStuff(0,0);

        if(i>0)
            printf("\n   block size (for a): %p-%p : %i",
                translatedArray[i], translatedArray[i-1], translatedArray[i]-translatedArray[i-1]);
    }

    return 0;
}

И вывод

   block size (for a): 0x804a420-0x804a018 : 516
   block size (for a): 0x804a828-0x804a420 : 516
   block size (for a): 0x804ac30-0x804a828 : 516

Согласно приведенному выше посту, который больше 1024. Я не прав?

Ответы [ 12 ]

1 голос
/ 10 января 2009

Перед указателем стоит размер следующего массива, который является 32/64 битным целым числом (не знаю, подписан он или нет)

0 голосов
/ 16 февраля 2018

malloc () может выделять непрерывную память, но когда вы вызываете malloc () 2 раза и не можете ожидать, что выделенная память будет смежной, вычитая переменные двух указателей ...

Однако выделенная память - это виртуальная память, которая является частью реализации ядра, а именно управление памятью (VFS). Это может не повлиять на функциональность приложения.

...