LINUX.ORG.RU

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

 , , openrange


1

3

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

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

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

★★☆
Ответ на: комментарий от AptGet

Ты упорот? Что ты мне доказываешь? Ты мне пытаешься доказать бесполезные в реальной жизни особенности.

& не работает для твоего «массива» только из-за обратной совместимости, как я говорил выше. Чтобы &m[0] и &m давали одинаковый результат, на самом делел &m это не &m, а тупо m.

Твой этот галимый пример говорит лишь о том, что px 0, а в a лежит адрес елемента.

  int p;
  int * px = &p;
  px[0] = 0xC001FACE; /* oops! */
  
  int a[1];
  a[0] = 0xDEADBEEF; /* ok */

Собери это и сравни, потом будешь вонять.

Вообщем, ты давай мне объяснишь - что показывает твой пример? Я не покачто не вижу, да и пример твой говно.

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

На тебе прогу-пруф:
Выводы:
0x6008b0 0x6008b0 0x6008b8 0x0

Похоже, у Вас конпелятор сбойнул, или процессор перегрелся.

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

Да шо ви говорите?

Ничего страшного, бывает: я знаю одного человека, который вообще в паинте скриншоты редактировал после внесения изменений.

Sorcerer ★★★★★
()

Я ничего не понял.

Можешь показать на примере 8-и битной адресации что к чему?

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

на таких мелочях шатлы и падают ;)

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

ok (пусть &a==0)

ui8 a[maxui8] резервирует нам массив в 255элементов от c индексом от 0 до 255-1.

при желании мы конечно можем обратится к a[255] и «погодать на короля»

т.е раньше как то не замечал что максимальный размер массива при равнобитности (B вовсе поля для случая когда шаг адресса 16битное слово) адрессов и данных не даёт легального(без выхода за границы) способо для заведения массива на всю память(данных)

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

при условии что унас и 8битная память и 8битный беззнаковыйцелый(наибольший тип)

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

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

Короче, си-проблемы :).

тем и ценен Степанов - ведь шатлы падают.

окей, я просмотрю его лекции, а то вдруг ПО для шаттлов заставят писать...

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

не не не

я про естественное в условиях С(факт того , что у Дениса Ритчи дисер? был по матлогике?) , что в случае возврата позиции в массиве как результата работы функции нет нужды в отдельном флаге/нул достаточно возвращать размер массива.

т.е как реально круто по итогу спроектирован С.

т.е писать на С++ я врядли когда буду , но вот модель STL с её итераторами ( а точнее , что «итераторы-сила») это вот важно понимать.

итераторы не всмысле конкретно та или иная реализация а как «координаты-позиции»

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

т.е как реально круто по итогу спроектирован С.

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

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

В сишке не нужны 95% костылей оопговна и прочих, которые нужны из-за ущербности почти всех ЯП, ибо они по определению говно.

Единственное, что в стл"е нормальное - это итераторы, но только из-за того, что это копипаста с Сиуказателей. Молодец.

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

режим адрессации с использование базового (индексного ? или ты про случай использования двух индексов вида const+bp+ir оба ) были вроде на лет десять(15?) раньше обнаружены (или больше) т.е вообще явление индексирование через регистр , а не через переписывание кода на ходу.

нет. просто факт , что (как раз там ссылка на аду) что именно разумней иметь ограничение на размер массива(за ведомо иметь такое число-индекс которое не может быть индексом(т.е вне читать то и по нему можно) ((unsign)-1 ) чем ограничивать(типизоровать) тип индекса.

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

в сишке

сипипишке быстрофикс

неа.

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

и то что стл взлетела на С++ - это ведь С++ повезло.

предыдущие варианты на схеме(а перед вроде и на CL),аде

вроде как не оптимально в код отображались.

указатели это рэндомитераторы - наиболее мощьные и следовательно наиболее требовательные к .

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

поэтому &p != p и &a == a

&p == p[0] p и a - машинные слова в которых хранится адрес памяти(указатель) в случае массива это указатель на первый элемент массива.

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

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

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

Ты серьёзно это написал или решил посмотреть на очередной срач?

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

ты не в курсе? )))

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

ты не в курсе?

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

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

все логично, extern же

без разницы вообще

static:

static int a[] = { 10 };
static int *b = a;

    .data
    .align  2
    .type   a, %object
    .size   a, 4
a:
    .word   10
    .align  2
    .type   b, %object
    .size   b, 4
b:
    .word   a

на стеке:

int main() {
    char c[] = "aaaaaaaaaaaaaaaaaaaaaa";
    char *d = "bbbbbbbbbbbbbbbbbbbbbb";
}

    [...]
    .section    .rodata
    .align  2
.LC1:
    .ascii  "bbbbbbbbbbbbbbbbbbbbbb\000"
    .align  2
.LC0:
    .ascii  "aaaaaaaaaaaaaaaaaaaaaa\000"
    [...]
    movw    r3, #:lower16:.LC0
    movt    r3, #:upper16:.LC0
    add r4, r7, #4
    mov r5, r3
    ldmia   r5!, {r0, r1, r2, r3} @
    stmia   r4!, {r0, r1, r2, r3} @
    ldmia   r5, {r0, r1}          @ массив
    str r0, [r4, #0]              @
    add r4, r4, #4                @
    strh    r1, [r4, #0]          @
    add r4, r4, #2                @
    lsr r3, r1, #16               @
    strb    r3, [r4, #0]          @
    movw    r3, #:lower16:.LC1
    movt    r3, #:upper16:.LC1
    str r3, [r7, #0]              @ указатель
    [...]

без оптимизации, конечно

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

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

смертельный номер - массив нулевой длины. жуткий хак конечно, нестандартно всё.

.text
.global lsl
.type lsl, %function

.global not_so_useless
.type not_so_useless, %object

.align 4
.code 32 

lsl:
	lsl r0, r0, #1
	bx lr
not_so_useless = . - lsl
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>

int lsl(int a);
extern int not_so_useless[];

int main() {
	int a = 10;
	int b;
	int (*copy_lsl)(int a);

	copy_lsl = malloc(not_so_useless);

	memcpy(copy_lsl, &lsl, not_so_useless);
	asm volatile("dmb" ::: "memory");

	__clear_cache(copy_lsl, copy_lsl + (int)not_so_useless + 1);

	asm volatile("dsb\n\r isb" ::: "memory");

	b = copy_lsl(a);

	printf("a: %d, b: %d\n", a, b);

}
$ ./test
a: 10, b: 20
AptGet ★★★
()
Ответ на: комментарий от AptGet

для полноты сценария можеш добавить сопутствующие( мне не очевидные :) ) сценарии make/ручного сбора

это асm чего ? :)

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

всё таки массив у тебя не нулевой длины ибо ты его кодом(ставшего данными :) инициализировал и место у него отведено :)

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

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

для полноты сценария можеш добавить сопутствующие( мне не очевидные :) ) сценарии make/ручного сбора

собирал так: gcc test.c test_asm.s -o test -O2

это асm чего ? :)

armv7, тегра2. На x86 такие финты проще сделать, барьеры не нужны и сбрасывать кеш не надо.

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

всё таки массив у тебя не нулевой длины ибо ты его кодом(ставшего данными :) инициализировал и место у него отведено :)

нет, там символ реально указывает в никуда, т.к. значение символа == размеру lsl(). Если объявить символ в С части например как extern int not_so_useless, то получить значение можно через &, т.е. copy_lsl = malloc(&not_so_useless); и т.д.

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

обычной переменной как-то так сделать можно:

.text
.global lsl
.type lsl, %function

.global sizeof_lsl
.type sizeof_lsl, %object

.align 4
.code 32 

lsl:
	lsl r0, r0, #1
	bx lr
not_so_useless = . - lsl

.data
sizeof_lsl:
.long not_so_useless
AptGet ★★★
()

вроде взрослый уже, волосы на ногах растут... :)

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

Все факи давно перенесены в Wiki, соответственно, Сишный фак тоже нужно в Wiki пилить.

С твоим посылом я согласен.

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

Они видимо никуда не ходят, кроме /forum/*, может прикрепить тему «FAQ по всему: прочитай или забанься» со всеми ссылками на вики? Я даже готов поучаствовать в свободное время и побанить, если права дадите.

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

как я говорил выше

А кто ты такой, что мы должны верить одному лишь твоему слову?

Что значит только из совместимости? А чему еще &m может быть равно, если определено как int m[1] ? Где в памяти хранится адрес &m? можем ли мы поменять его как это можно сделать с указаотелем.

int buf[2], *p=buf;
++p;
p[-1]
anonymous
()
Ответ на: комментарий от superhackkiller1997

в a лежит адрес елемента

Если что в a и лежит, то уж точно не адрес элемента. Посмотри на ассемблерный листинг, где там говорится о том, что в a лежит адрес элемента?

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

вот смотри, параметр malloc имеет тип size_t. Предположим, что

unsigned char *x=malloc(MAX_SIZE_T)
выделит запрашиваемое количество памяти. Тогда x[MAX_SIZE_T] будет обращаться к памяти вне выделенного куска.

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

С кем ты разговариваешь? С тем, кто не может мыслить (для его понимания недоступны абстракция, обобщение, анализ и синтез) и гордится этим? Зачем?

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

И где находится это машинное слово a?

&p ==p[0]

Совсем фигню написал.

anonymous
()

Ну теперь, когда я высрался, вернемся к сабжу. То, что так поразило ТС, будь он неладен, есть простое следствие того, что в переменной целочисленного беззнакового типа нельзя хранить значение числа равного количеству возможных значений этой переменной. Что в свою очередь является частным случаем более общего урверждения: мощьность множества целых чисел от 0 до N не принадлежит этому множеству, что если записать формально и посчитать ммощность такого множества, становится очевидным.

Т.е. весь этот срач начался с утверждения, которое является следствием тривиального факта: N+1>N.

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

факт что индекс от 0 ..maxsize-1 тривиален

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

что важно в этой тривиальности - что образование не может охватить все тривиальности и следовательно имеем , что имеем.

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

Ну вот, выспался и писать лучше стал.

образование не может охватить все тривиальности

Ну так и не надо охватывать все — надо охватывать базу и развивать способность из этой базы получать остальное.

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

Собери - посмотри, что ты этих хотел сказать, кроме балабольства я не понял.

    char m[1];
    char * p1 = m;
    char * p2 = &m;
Собири это, потом сравни чем они отличаются, а уже потом суйся со мной в разговор.

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