当我运行调试时,它指向行: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;
}
这是窗口的截图(更容易显示它而不是试图描述)
最佳答案
红色的线是你的调用堆栈:基本上,它告诉你问题发生在 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()
分配两个存储 block ,每个 N / 2
大小,并将它们分配给 L
和R
。如果N
不是偶数,然后仔细检查它是否是奇数,如果是奇数,则使用 malloc()
分配两个存储 block ,每个 N
大小,并将它们分配给 L
和R
。我认为您可能打算分配两个存储 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
,不是来自 0
至N
。 (此外,如果 N
是奇数,则您需要考虑最后一项......)。此外,您正在使用 m
和i
同时做同一件事。其中之一是不必要的、多余的、不需要的、额外的。
return LRChannels;
}
并且,返回 LRChannels
未修改地传递给函数的结构。同时,您将丢弃 L
和R
变量,其中包含指向 malloc()
的指针-分配的存储空间,现已丢失。
什么是 L
和R
应该是?看起来它们几乎应该是 unsigned char **
,因此您可以通过存储指针来将分配的存储空间返还给调用者...或者可能 struct LandR
有两个元素是指针,并且您打算保存 L
和R
在返回之前在结构中?对于 L
和R
,和LRChannels
,我根本不明白为什么你要把它们传递给函数。您不妨将它们设置为函数内的所有自动变量,就像 int i
一样。和int m
是。
关于c - 函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702739/