С чего бы? char[] - это ссылка на массив из символов. Сама ссылка - 4 байта, а выделяется ей столько, сколько разработчик написал.
байт это укус
Просто я тоже подумал, что шутка про "один укус", который отжирает пол-сендвича. А оказалось, что каламбур
Скорее всего тут игра слов, завязанная на том, что byte - укус и byte - столько занимает char в некоторых ОС. Просто тупая игра слов, не завязанная на особенностях выделения памяти и ссылок.
chat занимает 1 байт, с выравниванием по 4. Но тут-то не char, тут ссылка на массив из char. Ссылка занимает 4, а массив занимает столько, сколько ему выделят.
Память под элементы массива обычно выделяется в куче, а значит в RAM. Один элемент вполне может занимать байт. А ссылку на массив обычно кладут в переменную, а значит на стек. На картинке идет речь про RAM, а значит скорее всего речь про значения массива, а не про ссылку на первый элемент.
О боже, я увидел срач ниже и не хочу в нем участвовать.
Что stack, что heap - они все в RAM, просто способ упорядочивания памяти разный.
В языке C есть две разные сущности: указатель как отдельная переменная, которой программист может присваивать адрес области памяти и символ в таблице символов компилятора, с которым такое сделать нельзя. Под первое тратится память программы в сегменте данных или в куче или на стеке, под второе нет. char[] это второе, это символ компилятора, а не указатель, память тратится только под сам массив, но не существует адресуемой области памяти программы, где дополнительно хранился бы адрес этого массива.
Короче, char[] ни разу не указатель, несмотря на то, что может использоваться в адресной арифметике как константа.
Короче, char[] ни разу не указатель, несмотря на то, что может использоваться в адресной арифметике как константа.
Если ты имеешь в виду char[] как тип, то конечно же он не тратит нисколько памяти, но и получить ее не может. Так что это сразу мимо.
А вот переменная типа char[] занимает 4 байта, как и все указатели.
Полагаю, что художник просто перепутал char и char[]
А вот переменная типа char[] занимает 4 байта, как и все указатели.
Полагаю, что художник просто перепутал char и char[]
> но и получить ее не может. Так что это сразу мимо.
Может. Твои познания в C сильно устарели.
> А вот переменная типа char[] занимает 4 байта, как и все указатели.
char[] ни разу не указатель, это массив. Массив и указатель в C разные вещи.
Может, на примере будет проще:
char ch; /* символ */
char array[1]; /* массив символов */
ch занимает ровно один байт и нет такого места в памяти программы, где хранился бы адрес ch, это символ времени компиляции, а во время исполнения это просто фиксированное смещение от начала сегмента данных или на стеке и это смещение - константа времени выполнения, поменять её нельзя. Хотя можно поменять значение самого ch, разумеется. Ровно то же самое с array - это точно такой же символ компилятора и точно так же ему нельзя присвоить никакого другого значения.
char* pch = &array[0];
А вот тут явным образом выделено дополнительное место под указатель на начало массива и несмотря на то, что синтаксис C позволяет использовать pch вместо array, указатель не массив. В pch можно засунуть другой адрес (например, &ch), потому что pch - переменная, не фиксированное смещение от начала сегмента данных.
Может. Твои познания в C сильно устарели.
> А вот переменная типа char[] занимает 4 байта, как и все указатели.
char[] ни разу не указатель, это массив. Массив и указатель в C разные вещи.
Может, на примере будет проще:
char ch; /* символ */
char array[1]; /* массив символов */
ch занимает ровно один байт и нет такого места в памяти программы, где хранился бы адрес ch, это символ времени компиляции, а во время исполнения это просто фиксированное смещение от начала сегмента данных или на стеке и это смещение - константа времени выполнения, поменять её нельзя. Хотя можно поменять значение самого ch, разумеется. Ровно то же самое с array - это точно такой же символ компилятора и точно так же ему нельзя присвоить никакого другого значения.
char* pch = &array[0];
А вот тут явным образом выделено дополнительное место под указатель на начало массива и несмотря на то, что синтаксис C позволяет использовать pch вместо array, указатель не массив. В pch можно засунуть другой адрес (например, &ch), потому что pch - переменная, не фиксированное смещение от начала сегмента данных.
> ch занимает ровно один байт
От 1 до 4, но не суть.
Ты прав в том смысле, что char xx[] - в С создает массив из символов указанных сразу же. Но я еще раз повторю, что этот случай не имеет смысла, поскольку на него выделяется памяти столько требуется с поправкой на границу. Да и сам тип все равно называется char, а не Char[]
А вот в других языках, Type[] - обозначение ссылки на массив из типов с неопределенной заранее длиной массива.
От 1 до 4, но не суть.
Ты прав в том смысле, что char xx[] - в С создает массив из символов указанных сразу же. Но я еще раз повторю, что этот случай не имеет смысла, поскольку на него выделяется памяти столько требуется с поправкой на границу. Да и сам тип все равно называется char, а не Char[]
А вот в других языках, Type[] - обозначение ссылки на массив из типов с неопределенной заранее длиной массива.
> От 1 до 4, но не суть
Нет, sizeof(char) строго равно 1 по определению и это явным образом прописано в стандарте C.
Проблемы выравнивания это платформенно-зависимая штука, на разных архитектурах по разному и где-то вообще нет никакого выравнивания. В любом случае этот вопрос не имеет отношения к размеру char, который всегда занимает один октет.
> Да и сам тип все равно называется char, а не Char[]. А вот в других языках, Type[] - обозначение ссылки на массив из типов с неопределенной заранее длиной массива.
В современном C тоже. Ты можешь написать char a[] = "строка". Современный C даже поддерживает char a[n] внутри функции, где n это аргумент функции, выделяя на стеке массив переменного размера в момент входа в функцию. Так что char[] это тип в C, читай свежий стандарт.
Нет, sizeof(char) строго равно 1 по определению и это явным образом прописано в стандарте C.
Проблемы выравнивания это платформенно-зависимая штука, на разных архитектурах по разному и где-то вообще нет никакого выравнивания. В любом случае этот вопрос не имеет отношения к размеру char, который всегда занимает один октет.
> Да и сам тип все равно называется char, а не Char[]. А вот в других языках, Type[] - обозначение ссылки на массив из типов с неопределенной заранее длиной массива.
В современном C тоже. Ты можешь написать char a[] = "строка". Современный C даже поддерживает char a[n] внутри функции, где n это аргумент функции, выделяя на стеке массив переменного размера в момент входа в функцию. Так что char[] это тип в C, читай свежий стандарт.
Да камон, ты же писал "ch занимает ровно один байт", не sizeof, а "занимает" - т.е. актуальный расход памяти.
Вот тебе классический пример:
struct data {
char p;
int i;
};
Чему равен sizeof(struct data)) ?
> Что значит "не имеет смысла"?
Это значит, что ситуация не имеет смысла в контексте обсуждаемого комикса, где некая сущность обращается за выделением памяти.
Вот тебе классический пример:
struct data {
char p;
int i;
};
Чему равен sizeof(struct data)) ?
> Что значит "не имеет смысла"?
Это значит, что ситуация не имеет смысла в контексте обсуждаемого комикса, где некая сущность обращается за выделением памяти.
> Но я еще раз повторю, что этот случай не имеет смысла, поскольку на него выделяется памяти столько требуется с поправкой на границу.
Что значит "не имеет смысла"? Это работает и никаких дополнительных указателей на начало массива не существует.
Что значит "не имеет смысла"? Это работает и никаких дополнительных указателей на начало массива не существует.
А как программа знает где этот массив? И так и так где-то будет хранится адрес. С указателем будет хранится еще и адрес самого указателя. Максимум как можно укоротить данные это если они являются частью команды процессора. Тогда они будут занимать место в скомпилированном коде без адреса. Типа mov ah,09h
> А как программа знает где этот массив? И так и так где-то будет хранится адрес.
Нигде не хранится во время выполнения. Компилятор вставляет в код фиксированное смещение относительно начала сегмента данных (или от вершины стека) из своей таблицы символов, которая существует только во время компиляции.
Нигде не хранится во время выполнения. Компилятор вставляет в код фиксированное смещение относительно начала сегмента данных (или от вершины стека) из своей таблицы символов, которая существует только во время компиляции.
и это смещение занимает место в исходном коде. больше байта. т.е на обслуживание 1 байтовой переменной нужно больше байта инфы. где угодно.
Не в исходном коде. В машинном коде, в операндах машинных команд. "Где угодно" в данном случае не отменяет того, что в языке C указатель и массив не одно и то же.
окей в машинном. я его и имел ввиду. смысл в том что 1 байтовые типы по итогу все равно требеют больше байта в памяти.
Размер ссылки зависит от архитектуры системы - если х86 - 32 bit, если x64 - 64 bit
А вот уже размер объекта на который он ссылается - уже другой вопрос.
"Тебе нельзя, ты сожрал всю оперативу когда был маленьким!".
can I have a bit?
Чтобы написать коммент, необходимо залогиниться