LINUX.ORG.RU

Глупый вопрос по С

 


0

1

Почему подобный код работает

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


int main() {
	int *array = malloc(1 * sizeof(int));

	array[0] = 11;
	array[1] = 22;
	array[2] = 33;

	printf("%d\n", array[2]);
}

? Ведь мы выделили только один элемент размера int.

Ответ на: комментарий от Anon

Стандарт C99 раздел 6.2.5.2 §10

The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.

anonymous
()
Ответ на: комментарий от Anon

Выкинь свой говеный компилятор. Он тупит.

gcc --version
gcc (GCC) 4.8.0
Copyright (C) 2013 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.

что посоветуешь?

drBatty ★★
()
Ответ на: комментарий от anonymous

Прочитал. Нет там про сегфолт. Там спрашивается «Почему подобный код работает?»

а что такое «не работает» в контексте данного поста?

вот здесь Глупый вопрос по С (комментарий) у тебя код, который реально НЕ работает, причём именно с сегфолтом. Отличие только в константе.

drBatty ★★
()
Ответ на: комментарий от anonymous

The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.

угу. По-русски: не все запятые одинаково полезны, и параметры функций вычисляются в том порядке, который удобен компилятору. Потому непонятно, какое именно значение N будет передано в функцию, старое или новое.

drBatty ★★
()
Ответ на: комментарий от drBatty

Тьфу ты! До меня дошло!

Ты имел в виду printf!!!

Но насчет нее пофиг: единичкой меньше, единичкой больше — разница-то?

Anon
()
Ответ на: комментарий от drBatty

У меня в голове не фигня.

Твой проще - это уровень детсада, даже не 5-й, а 3-й группы. Никаких в юзерспейсе( юзерспейс, который контактирует с ведром) малоков и newвов нет, это уже локальный говноманег кучи в твоём рантайме.

Я не считаю себя программистов, а уж прикладным темболее. Нет, ты говоришь своему манагеру кучи. Ядро ничего тебе не заготавливает - ядро даёт тебе rw на страницы, не более. Факт, оно всегда заготовит с точностью до байта, ВСЕГДА, и я знаю сколько и когда.

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

Я писал выше нормальный пример, а не это говно.

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

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Так, superhackkiller1997, последнее предупреждение! Или ты перестаёш ругаться, или я тебя отправляю в баню.

beastie ★★★★★
()

Есть две функции, одна malloc_usable_size(), другая malloc_info().

Первая покажет вам, что обычно malloc() выделяет памяти немного больше, выравнивая по 16 байт. Вторая покажет, что после первого же malloc() у системы взято заметно больше памяти, чем ваш ″1*sizeof(int)″. Берётся M_TOP_PAD (128 кбайт) и ещё несколько байт под служебные данные, которые превращаются в ещё одну страницу 4096 байт, что в сумме даёт 135168 байт.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.