如何在C中为数组正确分配内存?

时间:2015-05-12 18:51:47

标签: c arrays memory malloc

很抱歉,如果这是一个新手问题,这是我第一次访问这个网站!

目前,我有一个数组:

float delayTable[];

这适用于音频编程类,因此该数组将用于存储单个音频样本。在一秒钟内,它需要存储44,100个不同的浮动。如何使用malloc为其提供足够的内存来保存10秒以上的数据?干杯!

2 个答案:

答案 0 :(得分:3)

我不确定你的意思是10秒以上,这可能是任何高于10的数字...... 如果要为信号分配10秒的数组,则必须将采样率乘以时间,然后乘以样本的大小,这样:

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

可替换地:

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

答案 1 :(得分: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;
}