2

当我说:“返回的变量是 NULL。”时,我的意思是它返回一个包含两个指针和they == NULL.

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

为什么会这样?

4

2 回答 2

5

你的函数接口不一致。

当您从内部创建它们时,您不需要拥有LR作为参数。

进来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;
}
于 2013-05-23T19:44:55.607 回答
4

你返回LRChannels参数,但你从不修改它,所以如果LRChannels.LNULL当函数被调用时,你将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和是传递参数的副本。您对这些参数所做的任何更改在函数之外都是不可见的。你为他们记忆Rmalloc

    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是参数的未修改副本。

您可能打算在返回之前设置Land的R成员,LRChannelsLR

LRChannels.L = L;
LRChannels.R = R;
return LRChannels;
于 2013-05-23T19:45:13.920 回答