0

当我运行调试时,它指向line: 105(并在左角写“分段错误”)。我不知道“调用堆栈”窗口中的红线是什么意思...

请告诉它是什么以及我在哪里可以阅读更多关于它的信息。

这是函数的代码:

/* 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; 
}

这是窗户的截图(更容易显示而不是试图描述)

在此处输入图像描述

4

3 回答 3

1

红线是您的调用堆栈:基本上,它告诉您问题发生在函数内部,该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 *Rstruct 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大小,并将它们分配给LR。如果N不是偶数,则再次检查它是否是奇数,如果是,则使用malloc()分配两个存储块,每个N大小,并将它们分配给Land 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 运行0N / 2而不是从0to运行N。(另外,你需要考虑最后一项,如果N是奇怪的......)。此外,您同时使用mandi做同样的事情。其中之一是不必要的,多余的,不需要的,额外的。

    return LRChannels;
}

并且,返回LRChannels未修改的传递给函数的结构。同时,您丢弃了LandR变量,其中包含指向malloc()-allocated 存储的指针,现在丢失了。

曾经LR应该是什么?它几乎看起来好像它们应该是unsigned char **,因此您可以通过存储指针来将分配的存储返回给调用者......或者可能有两个元素是指针,struct LandR并且您打算保存LR返回之前的结构?对于Land R, and LRChannels,我根本不明白你为什么将它们传递给函数。您不妨将它们全部设为函数内部的自动变量,就像int i现在一样int m

于 2013-05-23T00:49:21.863 回答
0

您在数组中有mallocedN/2元素,但在循环中,您的计数器从 0 变为N. 这意味着您正在尝试访问从 0 到的元素,因为您在每次迭代时都会N递增。m显然,你会得到一个段错误。

于 2013-05-22T22:44:42.290 回答
0

'smp' 的值是多少?

它要么需要在调用 sepChannels_8() 之前被分配,要么指向一个有效的占位符。

于 2013-05-22T22:54:08.370 回答