2013-05-22 3 views
0

디버깅을 실행할 때 line: 105을 가리키고 (왼쪽 모서리에 "세분화 오류"라고 기록합니다). "콜 스택"창에서 빨간색 선이 무엇을 의미하는지 모르겠다. ...함수의 세그먼트 오류

제발, 그것이 무엇인지, 그리고 그것에 대해 더 자세히 읽을 수 있는지 알려주십시오. 여기

함수의 코드입니다 :

/* Separates stereo file's samples to L and R channels. */ 
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R, 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); 
     } 

    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++; 
    } 
    return LRChannels; 
} 

그리고 여기 창문의 캡처 화면입니다 당신은 malloc 에드 N/2 요소가

enter image description here

답변

1

빨간색 줄은 호출 스택입니다. 기본적으로이 문제는 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 *Rstruct LandR LRChannels은 요점이 무엇인지 명확하지 않습니다. 을 사용하지 마십시오. unsigned char *Lunsigned 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()을 사용하고 LR에 할당 할 수 있습니다. N이 짝이 맞지 않으면 홀수인지 확인한 다음 malloc()을 사용하여 두 개의 스토리지 블록 (각각 N)을 할당하고 LR에 할당합니다. 각 블록 크기가 각각 (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이 이상한 경우에도 마지막 항목을 고려해야합니다. 또한 같은 시간에 mi을 동시에 사용하고 있습니다. 그 중 하나는 불필요하며 중복되거나 필요하지 않으며 추가로 필요합니다.

return LRChannels; 
} 

그리고, 수정되지 않은 함수에 전달 된 LRChannels 구조체를 반환합니다. 동시에 malloc() 할당 된 저장소에 대한 포인터가 포함 된 LR 변수를 삭제합니다. 이제 손실됩니다.

LR은 무엇이 될까요? 마치 unsigned char ** 인 것처럼 보이므로 호출자에게 포인터를 저장하여 할당 된 저장소를 다시 할당 할 수 있습니다 ... 또는 struct LandR에 포인터 인 두 요소가 있으며 L을 저장하려고했습니다. 및 구조체에 R 반환하기 전에? LRLRChannels에 대해서는 왜 함수에 전달하는지 알 수 없습니다. 함수 내에서 자동 변수를 모두 int iint m처럼 만들 수 있습니다.

0

(쉽게 대신 설명하기 위해 노력하는 그것을 보여주는) 배열에서 루프에 있지만 카운터는 0에서 N으로 이동합니다. 그리고 반복 할 때마다 m이 증가하므로 0에서 N까지 요소에 액세스하려고한다는 것을 의미합니다. 분명히, 당신은 seg 결함을 얻을 것이다.

0

'smp'값은 무엇입니까?

sepChannels_8() 호출 전에 할당되었거나 유효한 자리 표시자를 가리킬 필요가 있습니다.