C лучший способ очистить массив двойников - PullRequest
1 голос
/ 18 марта 2011

В C, как я могу сбросить данный указатель, чтобы все значения в массиве были указанным значением? Лучше всего использовать цикл for или есть функция, которую я могу использовать, чтобы установить все значения в массиве на 0.

Мой код сейчас выглядит примерно так:

int main()
{
     double *my_values = calloc(10, sizeof(double));
     do_something_with_values(my_values);

     free(my_values);
     my_values = calloc(10, sizeof(double));

     do_something_else_with_values(my_values);
     free(my_values);
}

Это (мне) кажется хакерским, как я могу улучшить этот код?

Ответы [ 8 ]

5 голосов
/ 18 марта 2011

memset может установить массив со всеми нулями или любым другим желаемым значением

4 голосов
/ 18 марта 2011

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

При выполнении free, а затем при новом вызове calloc вам НЕ гарантируется то же пространствобыть назначенным на ваш массив, это может быть проблемой, если у вас есть указатель на этот массив до того, как вы это сделаете, и попытаетесь использовать его позже.

1 голос
/ 18 марта 2011

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

int main(void) // <- this is the correct signature
{
     double my_values[10] = { 0 };
     do_something_with_values(my_values);

     memcpy(my_values, (const double[10]){0}, 10*sizeof(double));

     do_something_else_with_values(my_values);
}

Определение и инициализация гарантируют, что массив будет инициализирован с правильным значением 0.0 в любой архитектуре, в которой вы его запускаете. Повторная инициализация с memcpy делает то же самое. Для этого используется составной литерал. Для этой части вам понадобится компилятор, соответствующий C99.

0 голосов
/ 18 марта 2011

Для инициализации вы можете просто использовать:

double myarray[100] = {0};
0 голосов
/ 18 марта 2011

Давным-давно, в 1975 году, кто-то начал писать библиотеку для совершенно нового языка программирования C. Он имел более 64 КБ ОЗУ и имел доступ к одному из крупнейших в мире суперкомпьютеров.

Итак, когда были разработаны такие подпрограммы, как memset(), никто не мог представить, что вы захотите инициализировать нечто большее, чем 8-битный байт.Байт был огромный в то время.

Если вам нужно что-то большее, вы должны написать свой собственный цикл.С другой стороны, все типы C равны нулю, когда все байты равны 0. Таким образом, вы можете использовать calloc() или получить память из другого места и использовать memset(ptr, 0, size);

0 голосов
/ 18 марта 2011

Я могу быть совершенно неосновным, но: я бы использовал memset.

http://www.linuxmanpages.com/man3/memset.3.php

0 голосов
/ 18 марта 2011

Использование memset :

memset(my_values, 0, 10 * sizeof(double));
0 голосов
/ 18 марта 2011

Самый простой способ, вероятно, будет использовать memset

    memset( the_array, '\0', sizeof(the_array) );

Это обнулит весь ваш массив

...