LINUX.ORG.RU

максимальное число элементов в массиве в С?

 , , openrange


1

3

эт что же массив(еденичных элементов) по определению меньше всего адресного пространства ??

т.е если вся память адреса 0...2^64-1 то массив элементов единичного размера начинающийся с 0 адресса не может в себе содержать элемент максимального значения типа индекса

( ща когда 64 бита это не очень актуально но для 32 и тем более 16 оказывается массив(байтов) обязан быть меньше сегмента байтов.)

★★☆

Ответ на: Нихрена не понял от superhackkiller1997

здраствуй семён.

при условии что unsigned int(для превычности 16 бит) - это тип с наибольшим целым[допустимым в качестве индекса] значением на некоей машине

byte[intMax] a

массив байт начинающийся в начале адресов может обращатся к последнему адресу mem[intMax] через a[intMax] только нарушая границу a

qulinxao ★★☆
() автор топика
Ответ на: здраствуй семён. от qulinxao

может обращатся к последнему адресу mem[intMax] через a[intMax] только нарушая границу a

Сперва не уловил основную идею вопроса, не в битности было дело. Паскалистам проще в этом отношении, задаётся индекс, а не количество:
a: array [0..65535] of byte;

Равно как и в циклах по такому массиву (недавно была тема):
for i:=0 to 65535 do ...;

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

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

В любом случае адресной арифметикой можно получить доступ к любому элементу, в пределах размерности. А вот если индекс типа long всегда приводится в int, то это уже баг.

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

madcore речь о ситуации когда(баг в тегах нет зачёркивания)
*размер элемента массива 1
*индекс массива наибольший целый без знаковый тип muI этой машины
*массив начинается в начале адресного пространства
*адрес памяти не_меньше битный числа бит muI

в результате последний байт a[(muI)-1] всегда за границей объявленного byte a[(muI)-1]

qulinxao ★★☆
() автор топика
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от bormant

тык на 16 машине (при условии что muI 2 байта) в си не задаш массив в размер всего адрессного пространства byte a[65535+1]

т.е можно byte a[] и обращатся к a[чё угодно] явно нарушая границы

qulinxao ★★☆
() автор топика

эт что же массив(еденичных элементов) по определению меньше всего адресного пространства

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

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

В Си, массив это всего-навсего указатель.

Дальше не осилил?

В языке «C» существует сильная взаимосвязь между указа- телями и массивами , настолько сильная, что указатели и мас- сивы действительно следует рассматривать одновременно.

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

указа- телями

hizel

Доколе в цитатах переносы строк обрабатываться будут?

ziemin ★★
()
Ответ на: здраствуй семён. от qulinxao

Ну у тебя 0xffff - максимальный адрес, byte[0xffff] 0+0xffff*1 = 0xffff - т.е. твой последний адрес, в чем проблеам?

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

Да, да, массив - есть указатель, а [] - обёртка над адресной арифметикой для наглядности и для неосиляторов, иного в Си нет.

mas[10] и *(mas+10) идентичны, но первое являетсяо бёрткой над вторым.

superhackkiller1997
()

char *memory = 0;

Держи массив на всю оперативную память, обращайся к любому адресу на здоровье.

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

Ну на самом деле да. И что? В либц нет способов «алоцировать» что-то вне кучи, поэтому и юзается дефинишены такого вида, ибо синтаксис указателей этого не возволяет, но от этого они не перестают быть указателями, а массивы в Сишке не появляются.

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

Да, да, массив - есть указатель, [...]

Нет, семантика различается.

mas[10] и *(mas+10) идентичны, но первое являетсяо бёрткой над вторым.

Тут идентичны, а вот тут

int m[1]
int *a;

&a; //?
&m; //?

не идентичны

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

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

Хотя это плохой тон. Может в новых стандартах и чего похлеще будет.

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

char *memory = 0; Держи массив на всю оперативную память, обращайся к любому адресу на здоровье.

вот тока хотел такой пример привести, индекс может быть хоть беззнаковым 64-битным если до усрачки памяти есть

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от AptGet
  int m[1];
  int * a = alloca(4);
  &a; //?
  &m; //?

Мы не забудем пацантру, который вспомнил про алоку.

Отличается только тем, что синтаксически только так можно записать указатель и кол-во «алоцируемой памяти». Т.е. массив - это это запись указателя и кол-во адресов после него, но от этого m не перестаёт быть указателем, а [] адресной арифметикой.

Да и вообщем я даже не понимаю, что такое массив. Расскижи мне, авось я говорю фигню.

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

Ты почти понял. Перестаёт быть указателем и становится указателем и доступными элементами после него.

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

Пойди почитай, что ты мне тыкнул? Иди гляди стандарс сишки и либц, а потом уже воняй мне тут. В гнутой либц стопицот обёрток над __builtin_*, о которых стандарт даже не слышал. Это уже стало либц? нет, это глибц.

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

Компилятор при (ВНЕЗАПНО) компиляции присвоит твоей переменной, которую ты, почему-то называешь «указателем», значение, точно равное адресу.

Если ты хотел потролет, то надо было вместо static написать const.

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

Перестаёт быть указателем и становится указателем и доступными элементами после него.

Вам дорога в гиганты демагогии)

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

вместо static написать const.

И то не во всех компиляторах сработает.

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

Нет, это указатель, который не имеет ничего общего к елементам после него. А твоя цифра в скобочках говорит лишь о том, что конпелятор ничего не засунет в эти адреса.

T mas[100];
mas[101];//фейл твой теории.
superhackkiller1997
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.