红线是您的调用堆栈:基本上,它告诉您问题发生在函数内部,该sepChannels_8()
函数是从main()
. 实际上,您的sepChannels_8()
函数中有几个错误。
以下是我的分析:
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, struct LandR LRChannels)
sepChannels_8
是一个函数,它接受五个不同类型的参数并返回一个类型的值struct LandR
。但是,尚不清楚传递给函数的五个参数是什么。unsigned char *smp
似乎是指向您的音频样本的指针,unsigned long N
是样本总数。但是unsigned char *L
,unsigned char *R
和struct LandR LRChannels
, 根本不清楚重点是什么。你不使用它们。unsigned char *L
并且unsigned char *R
,您的函数会立即丢弃任何传入的指针,将它们替换为使用分配的内存malloc()
,然后将其丢弃而不是free()
d,您唯一要做的struct LandR LRChannels
就是简单地将其原封不动地返回。
{
int i;
if ( N % 2 == 0 ) // Each channel's (L,R) number of samles is 1/2 of all samples.
{
L = malloc(N / 2);
R = malloc(N / 2);
}
else
if ( N % 2 == 1 )
{
L = malloc(N + 1 / 2);
R = malloc(N + 1 / 2);
}
现在这很有趣:如果传入的unsigned long
, N
, 是偶数,您可以使用它malloc()
来分配两个存储块,每个存储块的N / 2
大小,并将它们分配给L
和R
。如果N
不是偶数,则再次检查它是否是奇数,如果是,则使用malloc()
分配两个存储块,每个N
大小,并将它们分配给L
and R
。我认为您可能打算分配两个(N + 1) / 2
大小各不相同的存储块,但是乘法和除法发生在加法和减法之前,所以这不是您得到的。你也没有考虑到如果发生什么N
既不是偶数也不是奇数。没关系,因为毕竟这是一个不可能的条件......那你为什么要测试这种可能性?
int m = 0;
for ( i = 0; i < N; i++ ) // separating
{
L[m] = smp[2 * i + 0]; // THIS IS THE "LINE: 105"
R[m] = smp[2 * i + 1];
m++;
}
大部分都很标准:你有一个循环、一个计数器和要遍历的数组。但是,您的终止条件是错误的。你一次走smp
两步你的数据,你通过乘以你的数组索引来做到这一点,所以你的索引计数器需要从 to 运行0
,N / 2
而不是从0
to运行N
。(另外,你需要考虑最后一项,如果N
是奇怪的......)。此外,您同时使用m
andi
做同样的事情。其中之一是不必要的,多余的,不需要的,额外的。
return LRChannels;
}
并且,返回LRChannels
未修改的传递给函数的结构。同时,您丢弃了L
andR
变量,其中包含指向malloc()
-allocated 存储的指针,现在丢失了。
曾经L
和R
应该是什么?它几乎看起来好像它们应该是unsigned char **
,因此您可以通过存储指针来将分配的存储返回给调用者......或者可能有两个元素是指针,struct LandR
并且您打算保存L
和R
返回之前的结构?对于L
and R
, and LRChannels
,我根本不明白你为什么将它们传递给函数。您不妨将它们全部设为函数内部的自动变量,就像int i
现在一样int m
。