LINUX.ORG.RU

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

 , , openrange


1

3

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

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

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

★★☆
Ответ на: [user] nokachi [/user] от qulinxao

ниче не понял, почему вы так хотите оверрайд этот несчастный массив? в нем легально можно только сто элементов, с оффсетом от нуля до 99

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

я не успеваю за вашей мыслью

Грибы?Зачем успевать за моей мыслью?

точно равное адресу

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

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

Это говорит о том, что mas - это указатель, который даже о размере елемента не знает, ни то что о том, какой длинны «массив».

По твоей теории это не просто указатель, а «указатель с доступными елементами после него», хотя елементы после ЛЮБОГО указателя доступны(кроме редких случаев), а так же доступны елементы и после оконцания «массива», что говорит о том, что твой массив нихрена не массив.

Вообщем ты несёшь какую-то муру.

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

где компилятор разместит затребованный массив...

Точнее это сделает динамический линкер, но такие подробности сильно зависят от платформы. Компилятор просто разместит инструкции линкеру.

Для простоты принято считать, что компилятор «размещает» данные в памяти.

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

понятно что не знает. По моей теории определить массив — это не только определить указатель но и память выделить под элементы. Пиздец, такую хуйню уже двум человекам объясняю, я точно по-русски пишу?

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

елементы после ЛЮБОГО указателя доступны(кроме редких случаев)

охуеть

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

Слился, обозвал школотроном - диагноз ясен, фу таким быть. Чтобы не оффтопить сделаем вывод - в сишке нет массив, массивов, что понимают под массивами 95% комьюнити. Т.е. это абстрактное хранилище елементов, которое хранит только свои елементы и доступны из которого только его елементы.

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

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

а дефинишн вида static int A[10]; — это тоже дефинишн указателя?

ВНЕЗАПНО!!11

Да осиль ты уже стандарт, кретин.

6.3.2.1.3:

Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

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

ты наверно так и пишешь

void foo(void) {
    int n = 100;
    char *A; // arrays are pointers, pointers are arrays
    // we hope there are elements past this address
    // because it's so most of the time
    A[0] = 'h';
    A[1] = 'e';
    A[2] = 'l';
    A[3] = 'l';
    A[4] = '0';
    printf("my n=%d\n", n); // wtf where is my n
}
nokachi
()
Ответ на: комментарий от amphibrakhij

если грубо, то указатель - это обычная переменная, с соответсвующей записью в таблице символов вида имя->адрес, по адресу хранится собственно значение указателя, т.е. адрес того объекта на который указатель ссылается. Все операции с переменными в С неявно разыменовывают адрес из таблицы символов.

с массивом все совсем не так - в таблице символов хранится адрес начала массива. Неявного разыменования при обращении к массиву нет.

Именно поэтому *p и *a работают одинаково, т.е.:

в случае указателя: получение адреса p по символу, неявное разыменование (разумеется, компилятор сразу подставит адрес, если может его вычислить), явное разыменование

в случае массива: получение адреса по символу, явное разыменование

операция & возвращает адрес, сохраненый в таблице символов, поэтому &p != p и &a == a

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

компилятор сгенерирует относительные адреса а никакие не инструкции линкеру

Программу будут запускать на тысячах систем. С разными объёмами памяти и т.д.

Компилятор размечает сегменты.

А уже линкер решает, что загрузить сразу. Что можно и потом. Что инициализировать, а что нет.

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

А каким образом это отменяет адресную арифметику?

Ты, кретин-Сергей, не способен ни читать, ни писать. Человек с нормальным мышлением в первую очередь обратит внимание на «is converted»

(&arr)[N]

Это выражение имеет совершенно другой тип, нежели ‘‘array of type’’.

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

Хорошо, что Вы, уважаемый кретин, козыряете цитатами. Может потрудитесь пример привети.

И да - я намеренно допустил ошибку в соём примере. Но Вы её не заметили :(.

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

ок, с массивами и указателями закончили, теперь у нас сегменты это инструкции линкеру а инструкции линкеру — это сегменты!

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

Значит не грибы...

В споре всегда создаётся момент, когда один из собеседников понимает, что он недостаточно квалифицирован.

И это я. Боюсь, что создал у тебя ложное впечатление. Я не разработчик компиляторов. Всё, что я выше упоминал я знаю из документации, что называется «для программистов». Базовые понятия о работе компилятора.

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

ок, а мне пора вставать. А вам прекрасно провести остаток выходных! Книжка линкерз энд лоудерс хорошая, если вдруг захочется об этом почитать.

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

Спасибо. Интересная особенность. Я как-то не обращал внимания

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

Для меня не существует массивов в твоём понимании, и я их не пишу. Я даже A[0] - считаю признаком маразма в 95% случаев.


char * a = "hello";//возвращает указатель, если ты не знал.
[\code]

В чем заключается твой вонизм я не понимаю, что ты хотел этим сказать?



Давай уже заканчивай нести пургу и начинай говорить посуществу.
superhackkiller1997
()
Ответ на: комментарий от AptGet

Нету никаких объектов, указатель ниначто ен ссылается, указатель не знает что он и кто он. Если брать конпелятор, то в зависимости от типа, если он простой - то конпелятор просто дунгрейдит регистр делая мувы.

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

Массив - это адрес + гарантия, что в рантайме Н-ное кол-во адресов после этого адреса будут зарезервированы и их никто не затрёт.

Ничего не понял, явное не явное. Бессмысленный набор букв. У какого-то такого указателя есть енявное разименование? И чем вообще отличается для конпелятора синтаксис указателя и массива?

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


char a[1];
char * b = alloca(1);//тоже самое, что строка выше, только там конпелятор это делает неявно, а тут ты делаешь это явно.
[\code]



Вообщем ты придумал соломенку, обрамил её невнятной мурой и пытаешься пропихнуть её - это плохо.
superhackkiller1997
()
Ответ на: комментарий от ilovewindows

Не понял, вот ут ебя есть 2-x байтное адресное пространство. адрес 0, 1, 2, 3; У тебя есть 2-хбайтный адресный регист - в него влезает всё до 3-хвкл.

m[0];
m[1];
m[2];
m[3];// - все четыре адреса доступные тебе

Открой мне глаза - я не понимаю.

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

Ах же ты ушлепок, иди проспись.

На тебе прогу-пруф:

#include <stdio.h>

int m[1];
int *a;

int main ()
{
    printf ("%p %p %p %p\n", &a, &m, a, m);
    return 0;
}

Выводы:

./test

0x6008b0 0x6008b0 0x6008b8 0x0

objdump -t test | grep p1

00000000006008b0 g O .bss 0000000000000004 p1

objdump -t test | grep p2

00000000006008b8 g O .bss 0000000000000008 p2

exit

Process terminal finished

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

Ок, маллок - это массив по твоей теории. malloc(100)[n]. Вообще-то только адреса, а не память. Память - это память, адреса это адреса. К массивам не имеет никакого отношения, зачем приплетать сюда массивы? Массив - это абстракция на которую в сишке есть лишь намёки и которая не нужена.

Вот я «определил» массив char * m = malloc(1000000); да? Ок, пусть будет это массивом. Суть спора заключается в том, что массив - это синоним указателю, а не то, что массив это отдельная конструкция.

Если для тебя проще называть указтель массивом - называй, поэтому я и спрашивал - «что для вас есть массив?».

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

На тебе прогу-пруф

Если честно не тянет. Где входные данные?

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

еще раз:

.data
.global a
.global p
a:
.long 0 /* array */
p:
.long a /* pointer to array a */
#include <stdio.h>

extern int *p;
extern int a[];

int main() {
        a[0] = 0xC001FACE;

        printf("a: %p, p: %p, *a: %x, *p: %x\n", a, p, *a, *p);
}
./test
a: 0x8049660, p: 0x8049660, *a: c001face, *p: c001face

Обрати внимание на адреса.

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

о ценности полуоткрытые ранжи . число позиций вставки/вариантов_возвращаемого_значения_индекса на 1 больше размера массива

у Степанова(STL) в лекции5часть2 (Successors of Peano Lecture 5 Part 2)

вот «полуоткрытый диапазон» от http://www.youtube.com/watch?feature=player_detailpage&v=01thucUWIug#t=410s до http://www.youtube.com/watch?feature=player_detailpage&v=01thucUWIug#t=635s

особенно 8:00 момент.

особенно 9:15 момент.

из этого массив максимального размера еденичных элементов обязан по обьявлению быть меньше чем число доступных елементов при всей памяти . т.е a[maxInt] не может быть обьявлен как часть массива с некоторым индексом ибо его индекс превышает максимально допустимый размер. (понятно что ничто не мешает разименовывать)

слайды 207-211

и на сладкое слайды 211 -213 из http://www.stepanovpapers.com/Journeys/Journey3.pdf

qulinxao ★★☆
() автор топика
Ответ на: комментарий от amphibrakhij

И? Что ты мне этим показал? Что конпелятор не берёт адрес m? На что это влияет? Это просто особенность поведения для m. Скастуй его в воид. Это оставили для совместимости - это не показатель того, что int * a и int b[1] разные вещи. Конпелятор просто для выражения &m выкидывает &, оставляя просто m.

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

ну и напоследок:

.data
.global a
.global p
.global px
a:
.long 0 /* array */
p:
.long a /* pointer to array a*/
px:
.long 0 /* wannabe array */
#include <stdio.h>

extern int *p;
extern int *px;
extern int a[];

int main() {
        a[0] = 0xC001FACE; /* ok */
        px[0] = 0xDEADBEEF; /* oops! */

        printf("a: %p, p: %p, *a: %x, *p: %x\n", a, p, *a, *p);
}

./test
Ошибка сегментирования
AptGet ★★★
()

Адресное пространство страницы - 4096 байт или 4096 единичных елементов - они спокойно влезают в 12бит, в которые и влезают 4096 значений.

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

Это как крановщик егор у которого есть копейка и кран говорит, а давайте создадим универсальный ПУ, ибо в копейке одно - в кране другое, я путаюсь - я лох. Ну и сваяет такое говно, которое не рыба и не мясо, на которым и на копейке нормально не поездишь и краном нормально не поуправляешь.

Самолёты, танки, легковухи - зачем разные ПУ - один покатит, и похрен, что в копейки из-за пары степеней свободы он будет избыточен, для танка так вообще, а для самолёта недостаточно быточен. А потом говорить, что разное - плохо, вадителю легковухи приходится учить новый интерфейс учать летать на самолёте, а танкинст федот хочет 2 тормаза на колёса как в его танке, а не баранку тухлую.

Вообщем это всё бредни съехавших и выживших из ума теоретиков, которые в жизни сложнее лабы в 20лет на бейсике/паскале ничего не писали, а разговаривают о правктике. На кол.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997
union { int a[5][5]; int b[25];} un;
union { int *c[5]; int d[25];} un2;
for (int j = 0; j<5; j++) { un2.c[j] == malloc(sizeof(int)); un1.a[1][j] = 8; un2.c[1][j]=8;}
printf("A: %d; B:%d\n", un.b[6], un2.d[6]);
Kiborg ★★★
()
Ответ на: комментарий от amphibrakhij

Я тебе уже рассказал - это фича конпелятора, ибо он просто игнорирует & в случае с массивом, потомучто в бородатые года было написано мильён говнокода с таким юзом и елси конпелятор бы отказался на нём работать - он был бы послан, поэтому конпелятор до сих пор держит говно.

Ты мне скажешь, что значит твоё &p1 не может быть равно p1? Или так и будешь фигню нести? Как твой код доказывает то, что m не является указателем? Что вообще значит твоя портянка?

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

для уважения Степанова достаточно того , что он отлично показывает связь между cs и вообще переключением битиков и матаном на примерах базовых-базовых.

т.е реально 1%(и это лесть) не просто прогеров - а среди знающих что есть бинпоиск реально его способны написать (хотя бы за 1 час) - это отличный пример насколько пока всё на неолетичеком уровне в прогерстве.

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

ты просто почитай сырцы stl

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

Самолёты, танки, легковухи - зачем разные ПУ - один покатит, и похрен, что в копейки из-за пары степеней свободы он будет избыточен, для танка так вообще, а для самолёта недостаточно быточен. А потом говорить, что разное - плохо, вадителю легковухи приходится учить новый интерфейс учать летать на самолёте, а танкинст федот хочет 2 тормаза на колёса как в его танке, а не баранку тухлую.

замечательный кстати пример - у него как раз посыл если ваш алго в процессе чёто насчитывает в процессе решения основной задачи - обдумайте может стоит добавить в возвращаемый набор это промежуточное значение - что бы БЕСПЛАТНО иметь возможность продолжать если приспичит

и не пытайтесь универсализировать навешивая ,

пытайтесь универсализировать ослабляя ожидания.

qulinxao ★★☆
() автор топика
Ответ на: комментарий от Kiborg

Пиши как человек, а не как хзкто.

union { int *c[5]; int d[25];} un2; - говно, люди пишут так int * un2;

un2.c[j] == malloc(sizeof(int)) - говно, люди пишут так: un2 = malloc(sizeof(int)*25);

un2.c[1][j]=8 - говно, люди пишут так(хотя люди так, как ты не пишут, но в твоём стайле можно написать так): *(un2+5+j) = 8;

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

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

но ты все-таки покажи как и что пишешь лично ты. А то пока голословно.

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

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

Почти с любым типом данных надо работать, если работать эффективно конечно, индивидуально. Если складывать лонгинт можно тупо в цикле, то с чарами выйдет говно и т.п. Банальные примеры.

Универсальность - это удел избранных, это удел тех 1%. Когда человек реально понимает её цену, когда понимает когда надо, а когда не надо юзать, а что у нас? «это всего пара лишних тактов» - универсальный ответ на всё.

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

У него, как и всех переходных форм есть здравые намёки, но - это основная проблема - его суждения работают в определённых условиях, а он пытается эти условия привести к всеобъмлющим.

Если стл это удел тех, кто может её написать - он этого не говорит. Более высокоуровневые фичи созданые не для уменьшения порога вхождения, а для облегчения рутины мастеру.

Пример, есть такая вещь как мультитул - создан как походный набор для мастера, который понимает, что мультитул игрушка и не более и белаз/хронометр он ей собирать не будет. А вот зелёный идиот, который будет хвалится, что в его мультитуле 20инструментов, которые заменяют чемодан с 20инструментами - будет соберать им белаз/хронометр и выйдет то, что выходит сейчас.

Всё это хорошо, но хорошо для избраных.

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