빨간색 줄은 호출 스택입니다. 기본적으로이 문제는 main()
에서 호출 된 sepChannels_8()
함수 내부에서 발생했음을 알려줍니다. 실제로 sepChannels_8()
함수에 몇 가지 버그가 있습니다.
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, struct LandR LRChannels)
sepChannels_8
은 다양한 종류의 다섯 개 인수를 입력 struct LandR
의 값을 반환하는 함수입니다 :
여기 내 분석이다. 그러나 함수에 전달 된 다섯 개의 인수가 무엇인지는 명확하지 않습니다. unsigned char *smp
은 오디오 샘플에 대한 포인터 인 것으로 보이며 unsigned long N
은 총 샘플 수입니다. 그러나 unsigned char *L
, unsigned char *R
및 struct LandR LRChannels
은 요점이 무엇인지 명확하지 않습니다. 은을 사용하지 마십시오. unsigned char *L
및 unsigned char *R
의 경우 함수는 전달 된 포인터를 즉시 폐기하고 malloc()
을 사용하여 할당 된 메모리로 대체 한 다음 free()
d없이 던져 버리고 struct LandR LRChannels
으로 수행하는 유일한 작업은 변경되지 않은 상태로 반환하는 것입니다.
{
int i;
if (N % 2 == 0) // Each channel's (L,R) number of samles is 1/2 of all samples.
{
L = malloc(N/2);
R = malloc(N/2);
}
else
if (N % 2 == 1)
{
L = malloc(N + 1/2);
R = malloc(N + 1/2);
}
지금이 흥미 다음이 전달 된 경우 unsigned long
, N
는 짝수는 두 개의 스토리지 블록의 크기가 N/2
를 할당 할 malloc()
을 사용하고 L
및 R
에 할당 할 수 있습니다. N
이 짝이 맞지 않으면 홀수인지 확인한 다음 malloc()
을 사용하여 두 개의 스토리지 블록 (각각 N
)을 할당하고 L
및 R
에 할당합니다. 각 블록 크기가 각각 (N + 1)/2
인 두 개의 스토리지 블록을 할당하려고했지만, 곱셈과 나눗셈이 더하기와 빼기 전에 발생했다고 생각합니다. 따라서 그렇게되지는 않습니다. 또한 N
이 짝수 또는 홀수가 아닌 경우 어떤 일이 일어나는지 설명하지 못합니다. 결국 그것은 불가능한 조건이므로 ... 가능성을 테스트하는 이유는 무엇입니까?
int m = 0;
for (i = 0; i < N; i++) // separating
{
L[m] = smp[2 * i + 0]; // THIS IS THE "LINE: 105"
R[m] = smp[2 * i + 1];
m++;
}
대부분 꽤 표준 : 당신은 카운터, 루프를 가지고, 및 배열이 통과 할 수 있습니다. 그러나 종료 조건이 잘못되었습니다. smp
데이터를 한 번에 두 단계 씩 진행하고 배열 인덱스를 곱하여 처리하므로 색인 카운터는 0
에서 N
이 아닌 0
에서 N/2
까지 실행해야합니다. (N
이 이상한 경우에도 마지막 항목을 고려해야합니다. 또한 같은 시간에 m
과 i
을 동시에 사용하고 있습니다. 그 중 하나는 불필요하며 중복되거나 필요하지 않으며 추가로 필요합니다.
return LRChannels;
}
그리고, 수정되지 않은 함수에 전달 된
LRChannels
구조체를 반환합니다. 동시에
malloc()
할당 된 저장소에 대한 포인터가 포함 된
L
및
R
변수를 삭제합니다. 이제 손실됩니다.
L
및 R
은 무엇이 될까요? 마치 unsigned char **
인 것처럼 보이므로 호출자에게 포인터를 저장하여 할당 된 저장소를 다시 할당 할 수 있습니다 ... 또는 struct LandR
에 포인터 인 두 요소가 있으며 L
을 저장하려고했습니다. 및 구조체에 R
반환하기 전에? L
및 R
및 LRChannels
에 대해서는 왜 함수에 전달하는지 알 수 없습니다. 함수 내에서 자동 변수를 모두 int i
및 int m
처럼 만들 수 있습니다.