开发音视频工程项目时,在音频的传输方面我们需要开发一些存储的堆栈或者队列,下面先从一维开始说起,另外用到两个对开拓空间很有用的函数:alloca,malloc
1、在栈上开发空间(一维):
float *pcm = NULL;
pcm = (float *)alloca(sizeof(float) * 1920 * 1);
参数是申请分配内存的字节数,返回值为分配到的内存地址。
它与malloc()函数的区别主要在于:
int main()
{
int *p = (int *)alloca(sizeof(int)*10);
free(p);//此时不能用free()去释放,会导致错误
return 0;
}
alloca主要的特征是,它是在栈上开辟的空间,当它作用域结束时会自动释放内存,不用像malloc那样,要用free动态释放空间。还有就是malloc开辟空间成功后,并未对内存空间初始化,必须调用memset来进行初始化,而alloca则初始化开辟的内存空间为0。
alloca性能上比malloc效率要高点。
需要用哪一个函数根据自己的倾向。
2、二维动态数组的建立:
C++版本:
int main(void)
{
int n = 10;
int m = 5;
float **temp = new float*[n];
for(int i = 0; i < n;i++)
{
temp[i] = new float[m];
}
for(int i = 0 ; i < n;i++)
{
for(int j = 0 ; j < m;j++)
{
temp[i][j] = i + j;
}
}
for(int i = 0; i < n;i++) //执行二维动态数组的删除工作
{
delete [] temp[i];
}
delete [] temp;
return 0;
}
C版本:
int main(void)
{
int n = 10;
int m = 5;
float **temp = (float**)malloc(sizeof(float*)*n);
for(int i = 0; i < n;i++)
{
temp[i] = (float*)malloc(sizeof(float)*m);
}
for(int i = 0 ; i < n;i++)
{
for(int j = 0 ; j < m;j++)
{
temp[i][j] = i + j;
}
}
for(int i = 0; i < n;i++) //C使用free来释放空间的
{
free( temp[i]);
}
free( temp);
return 0;
}
这时音频数据的读写就能游刃有余的放置了。