Почему при выделении памяти через malloc выделяеться памяти больше указанного

#include <windows.h>
#include <iostream>

int main()
{
    char *key = (char*)malloc(25);
    if(key != 0)
    {
        SecureZeroMemory(key, 25);
    }
    for(int i = 0;i < 26;i++)
    {
        key[i] = 'a';
    }
    std::cout << lstrlenA(key);
}

Вывод

38

Почему при выделении памяти размер key равен 38 если я указываю 25? Дело в lstrlenA или в какой-то особенности выделения памяти через malloc?


Ответы (1 шт):

Автор решения: Mikhailo

Вы выделили 25 байт, все их забили символом a, т.е. у вас вышло в памяти что-то вроде

aaaaaaaaaaaaaaaaaaaaaaaaa#@%$@@#^$^^%^%$^%#%^^%$#%...

где после a идет что-то, что записано в памяти за пределами выделенного вам места. Может, мусор, может, служебные данные менеджера памяти.

lstrlenA ищет количество символов от насчала строки, переданной как указатель в функции, и до первого нулевого символа, обозначающего конец строки. Вы в свои 25 байт такой символ не писали, так что функция пошла искать дальше, за пределами - уже В ЧУЖОЙ памяти.

Вы просто неверно интерпретируете возвращаемый функцией результат.

→ Ссылка