Назначенные инициализаторы, тратить неиспользованную и ненужную память? Как выделить только необходимую часть массива? - PullRequest
1 голос
/ 16 марта 2010

Я хочу использовать назначенные инициализаторы, но как насчет других индексов, которые не инициализированы?

Они тоже тратят мою память?

например:

Редактировать часть: {

int array [590] = {[2] = 1};

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

(хорошо, я знаю, что этот пример расплывчатый, я не хочу только одного типа int или любого другого типа, я не знаю, как объяснить, что я хочу. Но я думаю, что объяснять это не нужно, потому что мой вопрос не «как это сделать», мой вопрос «что произойдет, когда я это сделаю?» или «как это реализовано?», большое спасибо.)

как насчет памяти в этом? Я трачу 590 единиц памяти или только одну? Если первое правильно, как я могу потратить только один?

и если я сделаю это:?

int array [] = {[2] = 1, [590] = 2};

Я выделю 590 единиц памяти или только две?

}

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 16 марта 2010

Давайте спросим мистера Компилятора!

#include <stdio.h>
int main( int argc, char ** argv )
{
    int array[] = {[2] = 1, [590] = 2};
    printf("sizeof(array) is %d bytes\n", sizeof(array));
}

Опрос говорит:

$ gcc initsize.c
$ ./a.out
sizeof(array) is 2364 bytes

Да! 591 * 4 = 2364.

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

P.S. Есть много библиотек C с "разреженной матрицей"; просто Google для "C разреженной матрицы библиотеки". Но, для вектора из 591 элемента, это полное перебивание. Теперь, если у вас есть 10 000 таких векторов, это другая история.

1 голос
/ 16 марта 2010

Да, используемая вами декларация создаст массив из 5 элементов, и только одному из них будет присвоено значение «1».Остальное будет неинициализировано (я полагаю).

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

0 голосов
/ 16 марта 2010

Да, память выделяется при объявлении массива, даже если вы не инициализируете каждый элемент. Если вы хотите сохранить только одно значение, вам нужна одна переменная, вы также можете динамически выделять память, но для этого требуется хороший указатель и функции выделения / управления памятью (malloc, realloc, free и т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...