返回的变量为NULL

时间:2013-05-23 19:29:02

标签: c function pointers

当我说:“返回的变量是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之后。

为什么会这样?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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是一种按值传递的语言,因此函数中的两个指针LR是传递的参数的副本。您对这些参数所做的任何更改都不会在函数外部显示。你为他们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是参数的未修改副本。

您可能希望在返回之前将LR成员LRChannels设置为LR

LRChannels.L = L;
LRChannels.R = R;
return LRChannels;