Возвращаемая переменная равна 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 ответа:
Ваш функциональный интерфейс непоследователен.
Вам не нужно иметь
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;