2

「返された変数は NULL です」と言ったときは、2 つのポインターと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

関数インターフェースに一貫性がありません。

L内部から作成するため、 andRをパラメーターとして持つ必要はありません。

入って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.Lあった場合は、割り当て後に取得されます。NULLLRC_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 は値渡し言語であるため、関数内の 2 つのポインターLとは、渡された引数のコピーです。これらのパラメーターに加えた変更は、関数の外部では表示されません。彼らのためのあなたの記憶Rmalloc

    for ( i = 0; i < (N / 2) ; i++ )    // separating
    {
        L[i] = smp[2 * i + 0];
        R[i] = smp[2 * i + 1];
    }

それを埋めますが、それ以外の方法で使用しないでください。関数が戻ると、割り当てられたメモリに到達できなくなり、リークされます。呼び出し元のポインターもポインターが指すメモリも変更されないため、これら 2 つを関数の引数にすることはできません。または、呼び出し元のポインターを変更する場合は、それらのアドレスを渡す必要があります。

    // L and R don't need `free()`.

    return LRChannels;
}

LRChannels引数の変更されていないコピーです。

おそらく、戻る前にLRのメンバーをLRChannelsto にL設定するようなことを意図していたでしょう。R

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