Возвращаемая переменная равна NULL


Когда я сказал: "возвращаемая переменная равна 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.

Почему это так?

2 2

2 ответа:

Ваш функциональный интерфейс непоследователен.

Вам не нужно иметь 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;
}

Вы возвращаете параметр 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;