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
ed
N/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;
}