2016-09-05 6 views
1

При изучении указателей я обнаружил, что если я выделил память для 2-значного int, я могу дать этому int более высокое значение. Может ли кто-нибудь объяснить мне, почему это работает и как это работает?Как ограничить размер выделенной памяти?

Вот код:

int *p; 

p = (int *) malloc(2*sizeof(int)); 
p = 123456; 
+1

1. Не бросайте 'malloc'. Ever 2. Как вы думаете, что на самом деле этот код? – UnholySheep

ответ

4

Прежде всего, Please see this discussion on why not to cast the return value of malloc() and family in C..

При этом здесь вы просто перезаписываете указатель, возвращаемый malloc(). Не делай этого. Это приведет к утечке памяти. Кроме того, если вы попытаетесь разыменовать этот указатель позже, вы можете столкнуться с undefined behavior, так как нет гарантии, что этот указатель указывает на ячейку памяти , действительную. Доступ к недопустимой памяти приводит к UB.

Наконец, для решения

выделяет память для 2 цифр междунара [...]

позвольте мне сказать вам, вы выделение памяти для хранения два целых чисел , а не двухзначное целое число. Кроме того, чтобы сохранить целые значения в область памяти, указанную указателем, вам нужно разыменовать указатель, например *p, и сохранить (присвоить) значение там, например *p=12345;.

malloc() выделяет память размером байт передается как аргумент. Проверьте sizeof(int) (и 2*sizeof(int),, если вы хотите), чтобы сделать его более понятным.

По этому поводу, ссылаясь на C11, глава

void *malloc(size_t size);

malloc функция выделяет место для объекта, размер которого определяется size [...]

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

Кроме того, всегда рекомендуется проверять успех malloc() перед использованием возвращаемого указателя, чтобы избежать возможного UB путем разыменования NULL в случае ошибки malloc().

+1

спасибо, после прочтения вашего ответа у меня есть лучшее понимание того, как это работает – zoNNN

+0

@zoNNN Добро пожаловать. Вы также можете [рассмотреть вопрос о принятии любого ответа, который помог вам] (http://meta.stackexchange.com/q/5234/244062). –

+0

Хорошо, теперь я могу попросить причину занижения? –

0

выделить память для 2 значного междунар

malloc(2*sizeof(int)) выделяет память для два целых, а не для одного двузначного целого ,

2

Если я выделяю память для 2-значного числа, я могу дать этому int большее значение.

Нет, вы не можете. Вы выделили память для двух int с, с полным диапазоном int. Стандартные гарантии не менее пяти цифр (2 -1), но в большинстве современных систем вы можете хранить восемь цифр (2 -1).

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

Это Неотложное поведение. Система может потерпеть крах при доступе к памяти за конец выделенной области, но это не обязательно.

+0

спасибо за информацию, очень просто и легко понять: D – zoNNN

-1
  1. вам не нужно бросание в первую очередь

  2. Вы выделяемая память для двух целых чисел - как правило, 32 бита каждого

  3. Вы даете указателю значение 123456

Возможно, перечитайте книгу

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