C 函数中的分段错误
当我运行调试时,它指向C 函数中的分段错误,c,debugging,segmentation-fault,callstack,C,Debugging,Segmentation Fault,Callstack,当我运行调试时,它指向行:105(并在左角写入“segmentation fault”)。我不知道“调用堆栈”窗口中的红线是什么意思 请告诉我它是什么,我在哪里可以读到更多关于它的信息 以下是函数的代码: /* Separates stereo file's samples to L and R channels. */ struct LandR sepChannels_8( unsigned char *smp, unsigned long N, unsigned char *L, unsig
行:105
(并在左角写入“segmentation fault”)。我不知道“调用堆栈”窗口中的红线是什么意思
请告诉我它是什么,我在哪里可以读到更多关于它的信息
以下是函数的代码:
/* Separates stereo file's samples to L and R channels. */
struct LandR sepChannels_8( unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, 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);
}
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++;
}
return LRChannels;
}
/*将立体声文件的采样分离到L和R通道*/
结构LandR sepChannels_8(无符号字符*smp、无符号长N、无符号字符*L、无符号字符*R、结构LandR LRChannels)
{
int i;
如果(N%2==0)//每个通道的(L,R)采样数是所有采样数的1/2。
{
L=malloc(N/2);
R=malloc(N/2);
}
其他的
如果(N%2==1)
{
L=malloc(N+1/2);
R=malloc(N+1/2);
}
int m=0;
对于(i=0;i
下面是windows的演示(更容易显示,而不是试图描述)
数组中有
malloc
edN/2
元素,但在循环中,计数器从0变为N
。这意味着您正试图访问从0到N
的元素,因为您在每次迭代中都会增加m
。显然,您将遇到seg故障。smp的值是多少
它需要在调用sepChannels_8()之前分配,或者指向一个有效的占位符。红色的一行是您的调用堆栈:基本上,它告诉您问题发生在从
main()
调用的sepChannels_8()
函数内部。实际上,您的sepconnels\u 8()
函数中有几个bug
以下是我的分析:
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, struct LandR LRChannels)
sepChannels\u 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
和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++;
}
然后,返回传入函数的未修改的LRChannels
结构。同时,您将丢弃L
和R
变量,这些变量包含指向malloc()
分配存储的指针,但现在已丢失
L
和R
应该是什么?看起来似乎它们应该是无符号字符**
,因此您可以通过存储指针将分配的存储空间返回给调用者。。。或者,struct LandR
有两个元素是指针,您打算在返回它之前在struct中保存L
和R
?对于L
和R
以及lr频道
,我完全不明白您为什么要将它们传递给函数。您还可以在函数中使它们都是自动变量,就像inti
和intm
一样
return LRChannels;
}