2015-09-27 3 views
-1

Я использовал Java и совершенно новый для C. Я попытался создать функцию, которая генерирует случайный массив пикселей с malloc. Я освобождаю память в другой функции после использования этого случайного массива. Я думаю, что моя концепция в порядке, но мне интересно, правильно ли я пишу коды, и это действительно освобождает память кучи. Было бы здорово, если бы вы могли посмотреть на коды и посмотреть, работает ли это.malloc() и free() массив в c

pixel* randomPalette(int colors){ 

    int i, x; 
    pixel * randomArr = (pixel *)malloc(sizeof(pixel)* colors); 
    srand(time(NULL)); //generate a random seed 
    for (i = 0; i < colors; i++){ 
     x = rand() % 256; 
     randomArr[i].r = x; randomArr[i].g = x; randomArr[i].b = x; 
    } 
    return randomArr; 
} 

void QuantizeA(pixel* Im, int width, int height){ 
    //create a random palette of 8 RGB colors; 
    const int num = 8; 
    pixel* Arr = randomPalette(num); 

    //find the min distance between pixel and palette color 
    int x, y, z; 
    int min = 195075; // max distance is 255^2 + 255^2 + 255^2 
    int pos = 0; 
    for (x = 0; x < height; x++){ 
     for (y = 0; y < width; y++){ 
      //compare distance of the pixel to each palette color 
      for (z = 0; z < num; z++) { 
       if (distance(Im[pos], Arr[z]) < min){ 
        Im[pos].r = Arr[pos].r; 
        Im[pos].g = Arr[pos].g; 
        Im[pos].b = Arr[pos].b; 
       } 
      } 
      pos++; //go to next piexl 
     } 
    } 
    glutPostRedisplay(); 
    free(Arr); 
} 
+3

[Пожалуйста, смотрите эту дискуссию о том, почему не бросить возвращаемое значение 'таНос()' и семьи в 'C'.] (http://stackoverflow.com/q/605845/2173917). –

+2

И проверьте, если 'malloc()' возвращает 'NULL', исключений в c нет, поэтому вы можете быть осторожны. Кроме того, в чем вопрос? Переполнение стека не предназначено для проверки правильности рабочего кода, если оно не сработало, пожалуйста, укажите, как это не удается, в противном случае найдите подходящий сайт для вашего вопроса, есть [Обзор кода] (http://codereview.stackexchange.com /). –

+0

В этом случае мне нужно указать возвращаемое значение malloc(), иначе это как-то придет ошибка. – MLAC

ответ

1

Из памяти выделения-открепление части, код нормально (я не проверял логику). Тем не менее, здесь есть две вещи,

  1. Перед использованием возвращаемого значения проверьте успех malloc().
  2. Вам необходимо позвонить srand(time(NULL)); только один раз в начале вашей программы, возможно, в main().

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

Также, пожалуйста, ознакомьтесь с этим обсуждением на why not to cast the return value of malloc() and family in C..

+0

Спасибо. Я попытался не использовать возвращаемое значение malloc(), но почему-то это получило ошибку. Если я отброшу его (pixel *), он отлично работает. – MLAC

+2

@MLAC вы уверены, что используете компилятор 'C'? –

+0

Я использую VisualStudio 2013 ... Это .cpp, но коды находятся в c .... :) – MLAC

1

При назначении нового минимального расстояния:

Im[pos].r = Arr[pos].r; 

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

Im[pos].r = Arr[z].r; 

В качестве примечания: Вы не можете сравнить два с структур операторов сравнения, даже не за равенство, но C позволяет назначить один-структуру в другую, которая эффективно копирует содержимое. Так что вам не нужно скопировать все компоненты, вы можете просто сказать:

Im[pos] = Arr[z]; 
+0

о, да ... спасибо. – MLAC

Смежные вопросы