Несмотря на принятый ответ (который я считаю правильным), кажется, что существует путаница относительно того, сколько байтов выделено из-за выравнивания. Итак, вот небольшой тест на моем 32-битном Linux с gcc-4.3:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* p1 = calloc(6, 4);
char* p2 = calloc(4, 6);
char* p3 = calloc(1,1);
printf("%p, %p, %p\n", p1, p2, p3);
return 0;
}
Результат:
0x826b008, 0x826b028, 0x826b048
, который показывает, что и calloc(6,4)
, и calloc(4,6)
выделяют одинаковый объем памяти, который округляется до 32 байт в моей системе. Изменение чисел на calloc(3,4)
и calloc(4,3)
даст следующий результат:
0x95d2008, 0x95d2018, 0x95d2028
, который показывает, что 16 байтов зарезервированы, когда 12 запрошены и выделены для программы. В любом случае вызовы calloc(a,b)
и calloc(b,a)
одинаково влияют на использование памяти.
Добавлено Джонатаном Леффлером, потому что 300 символов никогда не будет достаточно.
Рассмотрим эту программу, которая пропускает память как настоящее сито, но демонстрирует точку:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i, j, k;
for (i = 1; i < 17; i++)
for (j = 1; j < 9; j++)
for (k = 0; k < 4; k++)
printf("(%2d,%d)%d: %p\n", i, j, k, calloc(i, j));
return(0);
}
В Windows, под Cygwin, это начинается с выделения блоков, которые находятся на расстоянии 16 байтов (фактически, второй блок составляет 24 байта после первого, но после этого они на расстоянии 16 байтов). При выделении (2,7) адреса блоков начинают увеличиваться на 24 байта; аналогично, (3,4) распределяет блоки по 16 байтов, но (3,5) распределяет блоки по 24 байта. И, к сведению, оба (4,6) и (6,4) возвращают указатели на расстоянии 32 байта.
Это просто демонстрирует, что с вызовом выделения связаны некоторые издержки. Если вы посмотрите на архетипическую реализацию malloc () и др. В K & R, то увидите, что размер блока хранится впереди памяти, которую вы имеете право использовать. Различные реализации делают эти вещи по-разному; Те, кто беспокоится о растоптании памяти, избегают хранения контрольных данных рядом с местом, где пользователь может нанести ущерб.
Когда вы используете calloc (4,6), вы имеете надежный доступ только к 24 байтам данных. Даже если ваша реализация выдает возвращаемые значения с интервалом в 32 байта, вы не можете безопасно использовать больше, чем 24 запрошенных вами байта. А отладочные версии malloc () будут наблюдать, если вы напишете за запрошенные вами границы.