Использует ли memcpy () функцию realloc ()? - PullRequest
5 голосов
/ 23 мая 2011
#inlcude <stdio.h>
#inlcude <stdlib.h>
#inlcude <string.h>

int main() {
    char *buff = (char*)malloc(sizeof(char) * 5);
    char *str = "abcdefghijklmnopqrstuvwxyz";

    memcpy (buff, name, strlen(str));

    while(*buff) {
        printf("%c" , *buff++);
    }

    printf("\n");

    return 0;
}

этот код печатает всю строку "abc ... xyz".но у «баффа» недостаточно памяти для хранения этой строки.как работает memcpy ()?он использует realloc ()?

Ответы [ 4 ]

10 голосов
/ 23 мая 2011

Ваш код имеет Неопределенное поведение . Чтобы ответить на ваш вопрос, NO , memcpy не использует realloc. sizeof(buf) должно быть достаточно для размещения strlen(str). Все, что меньше, это крах.

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

const char* const str = "abcdefghijklmnopqrstuvwxyz";
char* const buff = (char*)malloc(strlen(str) + 1);

Кроме того, не делайте *buff++, потому что вы потеряете запись памяти (то, что вы выделили). После malloc() нужно сделать free(buff) после окончания использования памяти, иначе это утечка памяти.

8 голосов
/ 23 мая 2011

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

memcpy не выполняет никакого выделения памяти. Он просто читает и пишет в указанные вами места. Он не проверяет, что это нормально, и в этом случае вам повезет, если ваша программа не вылетит.

1 голос
/ 23 мая 2011

Нет memcpy не использует malloc.Как вы и подозревали, вы списываете конец buff.В вашем простом примере это не приносит видимого вреда, но это плохо.Вот некоторые вещи, которые могут пойти не так в «настоящей» программе:

  • Вы можете набросать что-то, выделенное в памяти, после ваших buff, приводящих к тонким (или не очень тонким) ошибкампозже.
  • Возможно, вы набросаете заголовки, используемые внутри malloc и free, что приведет к сбоям или другим проблемам при следующем вызове этих функций.
  • Возможно, вы в итоге напишитена адрес, который не был выделен вашему процессу, и в этом случае ваша программа будет немедленно аварийно завершена.(Я подозреваю, что это то, что вы ожидали.)

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

1 голос
/ 23 мая 2011

как работает memcpy ()?

Потому что вы вызвали неопределенное поведение. Неопределенное поведение может работать точно так, как вы ожидаете, и может делать что-то совершенно другое. Это может даже отличаться между различными запусками одной и той же программы. Он также может отформатировать ваш жесткий диск и при этом соответствовать стандарту (хотя, конечно, это маловероятно: P)

Неопределенное поведение означает, что поведение буквально не определено, чтобы делать что-либо. Все верно, включая поведение, которое вы видите. Обратите внимание, что если вы попытаетесь free памяти, среда выполнения C вашей целевой платформы, вероятно, будет жаловаться. ;)

...