c - 函数中的段错误

标签 c debugging segmentation-fault callstack

当我运行调试时,它指向行: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; 
}

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

enter image description here

最佳答案

红色的线是你的调用堆栈:基本上,它告诉你问题发生在 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 *Lunsigned 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()分配两个存储 block ,每个 N / 2大小,并将它们分配给 LR 。如果N不是偶数,然后仔细检查它是否是奇数,如果是奇数,则使用 malloc()分配两个存储 block ,每个 N大小,并将它们分配给 LR 。我认为您可能打算分配两个存储 block ,每个存储 block (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走下去数据一次两步,并且您通过乘以数组索引来完成此操作,因此您的索引计数器需要从 0 开始运行至N / 2 ,不是来自 0N 。 (此外,如果 N 是奇数,则您需要考虑最后一项......)。此外,您正在使用 mi同时做同一件事。其中之一是不必要的、多余的、不需要的、额外的。

    return LRChannels;
}

并且,返回 LRChannels未修改地传递给函数的结构。同时,您将丢弃 LR变量,其中包含指向 malloc() 的指针-分配的存储空间,现已丢失。

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

关于c - 函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702739/

相关文章:

c - NVCC:警告:允许所有异常与以前的功能不兼容

swift - 更漂亮的调试输出在 Xcode 中打印 Swift 字典

Java 程序无缘无故地无限循环

c++ - std::string 的 type_traits 段错误

在 C 中比较以空字符结尾的字符串和非以空字符结尾的字符串

c - 根据C中char的值分配char数组

c - 使用 OpenCV 时 GTK 应用程序不刷新 UI

javascript - 如何使用 javascript sdk 调试 facebook connect 应用程序和 xfbml 解析?

c - 调试C程序中的段错误

c - 在 LAPACK 中查询 dgel 的最佳 block 大小