2016-12-02 7 views
1

C noob здесь. Какое значение имеет аргумент, который я даю malloc, когда я могу передать ему какую-либо строку размера?Какое значение имеет аргумент malloc?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    char *str; 
    str = malloc(1*sizeof(char)); 
    strcpy(str, "abcd"); 
    printf(str); 
    printf("\n"); 

    return 0; 
} 

Это прекрасно работает. Я бы подумал, что я не смогу хранить более 1 символа в str от моего понимания того, что должно быть malloc.

+4

C не имеет границ проверки. Вывод за пределы приводит к * неопределенному поведению *. –

+0

Попробуйте записать, скажем, 1 МБ символов для этого 1 байтового распределения. Ваша программа выйдет из строя. – eddiem

+1

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

ответ

5

malloc может в конечном итоге распределить больше, чем ожидалось, для поддержания выравнивания/упрощения распределителя.

Что вы делаете, это неопределенное поведение, и, помимо всего прочего, «неопределенный» может означать «работает, иногда». Не делайте этого, потому что другие варианты не так хороши. Некоторое время он рухнет. Некоторое время он будет работать, но, оказывается, вы испортили кучу, и в какой-то более поздний момент, используя или освобождая какое-то совершенно другое распределение, вы получите «необъяснимые» данные или связанные с кучей ошибки, t связано с переполнением любым очевидным способом.

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

Смежные вопросы