c: распределение памяти (что происходит) - PullRequest
0 голосов
/ 28 апреля 2010

Пожалуйста, посмотрите на этот кусок кода. Я выделяю один байт для первой переменной и еще один байт для второй. Тем не менее, похоже, что компилятор выделяет больше (или я что-то упустил). Программа выводит обе строки, хотя их длина больше одного байта.

void main() {
    char* some1 = malloc(1);
    sprintf(some1,"cool");
    char* some2 = malloc(1);
    sprintf(some2,"face");
    printf("%s ",some1);
    printf("%s\n",some2);
}

Пожалуйста, кто-нибудь может подсказать, что происходит, когда выделяется память.

Ответы [ 5 ]

7 голосов
/ 28 апреля 2010

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

На самом деле происходит то, что система выделяет вам память большими кусками. Таким образом, пока вы находитесь за пределами границ, определенных вашей программой, вы не превысили буфер до уровня системы. Почти все реализации делают это; Скажем, системе проще отслеживать, например, 16-байтовые фрагменты, чем делать это побайтово.

7 голосов
/ 28 апреля 2010

Вы выделяете один байт, а затем выходите за границы выделенной памяти. sprintf не выполняет проверку границ (его друг, snprintf выполняет проверку границ).

Когда вы переполняете свою выделенную память, вы получаете неопределенное поведение, поэтому может произойти все что угодно. В вашем случае, похоже, работает правильно. Ваша программа может также аварийно завершить работу или произойти что-либо еще.

2 голосов
/ 28 апреля 2010

Вы выделяете «как минимум» 1 символ для вашего массива и затем добавляете в него 5 символов (4 для строки, 1 для \ 0). Вы обычно перезаписываете память вне вашего массива, и это не очень хорошая идея.

Причина, по которой это работает, заключается в том, что вам (не) повезло в том, что ничто иное не засорено.

2 голосов
/ 28 апреля 2010

Неопределенное поведение!

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

1 голос
/ 28 апреля 2010

Обычно операционная система дает вам больше, чем вы просите, просто для упрощения бухгалтерии или по любым другим причинам. Поведение программы не определено, если вы используете больше запрашиваемой суммы.

Используйте программу типа Valgrind , и она скажет вам, что вы сделали что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...