2017-02-16 11 views
1

Это назначение C для школы, но я сталкиваюсь с чем-то странным, что я не знаю, нормально это или нет.Маллок выделяет больше памяти, чем нужно?

Я должен принимать аргументы командной строки и пример одного является

-ia.b

так в моей программе я динамически выделять память с malloc

char *fileName = NULL; 
fileName = malloc(strlen(argv[i]) * sizeof(char)); 
//error testing etc 
strcpy(fileName, argv[i]); 

Отлично работает, но я заглядываю в память через отладчик визуальной студии, это то, что стало выделено в памяти, где мне больше места, чем нужно d:

0x01608b98 "ÍÍÍÍÍýýýýB`\x1˜?`\x1\xf1¼O{º" 

, если я бросаю таНос, такие как так fileName = (char*)malloc(strlen(argv[i]) * sizeof(char)); я получаю это выделяемой памяти:

0x009d8d38 "ÍÍÍÍÍýýýýB" 

Учитывая, что мой аргумент 5 байт, является таНос выделение большего количества памяти, то он должен или я просто делаете это неправильно?

+2

Это вполне возможно, что он выделит немного больше, чем вы просите. Но я не понимаю, как вы определяете, сколько выделяется. –

+0

Да, реализация malloc часто выделяет больше памяти, чем вы запрашиваете для внутреннего использования. – d3L

+3

Вполне возможно. Но это не будет защищать вас от недостатка **, где выделенная память точна, потому что 'strlen (argv [i])' должен быть '(strlen (argv [i]) + 1)', чтобы разрешить строку terminator для последующего 'strcpy'. –

ответ

3

Обычно malloc выделяет память в кусках, точно делящихся на размер абзаца, равный 16 байтам (то есть malloc выделяет куски с фундаментальным требованием выравнивания). Однако вы не должны полагаться на это внутреннее поведение malloc. В противном случае поведение не определено.

+1

«Размер абзаца». Вы все еще используете DOS? ;) –

+0

@ DanielKamilKozar Я не проверял, какой минимальный размер памяти выделяется malloc в современной ОС. :) –