2015-05-12 4 views
1

Извините, если это такой новичок, это мой первый раз на этом сайте!Как правильно назначить память массиву в C?

В настоящее время у меня есть массив:

float delayTable[]; 

Это для аудио класса программирования, поэтому этот массив будет использоваться для хранения отдельных звуковых образцов. За одну секунду он должен хранить 44 100 различных поплавков. Как я могу использовать malloc, чтобы дать ему достаточно памяти для хранения 10 + секунд данных? Ура!

+1

Целые числа или поплавки? –

+0

Поплавки! Извините за недопонимание. – KingJ

+0

Если вы знаете, что это ровно 44,100 элементов, вам не нужно 'malloc'. Просто объявляйте 'float delayTable [44100]'. Возможно, вам лучше распределить массив в разделе данных, а не в стеке. Для этого объявите его как «статический» в функции или глобальным в файле. –

ответ

3

Я не уверен, что вы имеете в виду еще на 10+ секунд, что потенциально может быть числом выше 10 ... Если вы хотите выделить массив на 10 секунд сигнала, вам нужно умножить образец скорость по времени, и умножить на размер образца, так что:

float *delayTable = malloc(44100 * 10 * sizeof(float)); 

в качестве альтернативы:

float *delayTable = malloc(44100 * 10 * sizeof(*delayTable)); 
+0

Используете ли вы другое имя для массива? Параметр malloc кода имеет смысл, но я не вижу, где он фактически помещает это число в "delayTable" – KingJ

1

вопрос просил «10+» секунд время записи - предполагая длину не фиксируется , Этот ответ предназначен для времени записи «0+» секунд, расширяя массив по мере продолжения записи.

#include <stdio.h> 
#include <stdlib.h> 

float getsample(void) {       // placeholder function 
    return (float)rand()-1; 
} 

int main(void) { 
    float *delayTable = NULL;     // start with no array memory 
    float sample; 
    int samplespersec = 44100; 
    int secs = 0; 
    int numsamples = 0; 
    int maxsamples = 0; 

    while ((sample = getsample()) >= 0) {  // imaginary, func returns < 0 when done 
     if (numsamples == maxsamples) {   // array is full 
      secs++;        // memory for one more second 
      maxsamples = secs * samplespersec; // improve by checking int constraint 
      delayTable = realloc(delayTable, maxsamples * sizeof(*delayTable)); // expand 
      if (delayTable == NULL) 
       exit(1);      // improve this error condition 
     } 
     delayTable[numsamples++] = sample; 
    } 
    printf("Recorded %d samples\n", numsamples); 
    //free(delayTable); 
    return 0; 
} 
Смежные вопросы