当我说:“返回的变量是NULL。”,我的意思是它返回一个包含两个指针和they == NULL
的stuct。
struct LandR_8
{
unsigned char *L; // For L channel.
unsigned char *R; // For R channel.
}; // These pointers point to the allocated memory.
struct LandR_8 LRChannels_8;
我的功能:
struct LandR_8 sepChannels_8( unsigned char *smp, unsigned char *L, unsigned char *R, unsigned long N, struct LandR_8 LRChannels )
{
int i;
L = malloc(N / 2);
R = malloc(N / 2);
for ( i = 0; i < (N / 2) ; i++ ) // separating
{
L[i] = smp[2 * i + 0];
R[i] = smp[2 * i + 1];
}
// L and R don't need `free()`.
return LRChannels;
}
返回LRChannels
类型的变量struct LandR
:
我这样称呼我的功能:
LRC_8 = sepChannels_8( ptrSamples_8, ptrSamples_8_L, ptrSamples_8_R, n, LRChannels_8 );
问题是在使用该功能LRC_8.L == NULL
之后。
为什么会这样?
答案 0 :(得分:5)
您的功能界面不一致。
从内部创建参数时,您不需要L
和R
作为参数。
进入LRChannels
也会产生反作用。
最简单的设计可能是
struct LandR_8 sepChannels_8( unsigned char *smp, unsigned long N)
{
unsigned char *L;
unsigned char *R;
struct LandR_8 LRChannels;
int i;
L = malloc(N / 2);
R = malloc(N / 2);
for ( i = 0; i < (N / 2) ; i++ ) // separating
{
L[i] = smp[2 * i + 0];
R[i] = smp[2 * i + 1];
}
// L and R don't need `free()`.
LRChannels.L = L;
LRChannels.R = R;
return LRChannels;
}
答案 1 :(得分:4)
您返回LRChannels
参数,但从未对其进行修改,因此如果调用该函数时LRChannels.L
为NULL
,则在分配后您将LRC_8.L == NULL
。
该功能有更多错误:
struct LandR_8 sepChannels_8( unsigned char *smp, unsigned char *L, unsigned char *R,
unsigned long N, struct LandR_8 LRChannels )
{
int i;
L = malloc(N / 2);
R = malloc(N / 2);
C是一种按值传递的语言,因此函数中的两个指针L
和R
是传递的参数的副本。您对这些参数所做的任何更改都不会在函数外部显示。你为他们malloc
记忆
for ( i = 0; i < (N / 2) ; i++ ) // separating
{
L[i] = smp[2 * i + 0];
R[i] = smp[2 * i + 1];
}
并填写它,但绝不以任何其他方式使用它。当函数返回时,分配的内存不再可访问,它被泄露。既然调用者中的指针都没有改变,也没有指向他们指向的内存,这两个根本不应该是函数的参数 - 或者,如果你想修改调用者中的指针,你需要传递他们的地址。
// L and R don't need `free()`.
return LRChannels;
}
LRChannels
是参数的未修改副本。
您可能希望在返回之前将L
和R
成员LRChannels
设置为L
和R
,
LRChannels.L = L;
LRChannels.R = R;
return LRChannels;