2013-05-22 3 views
0

Когда я запускаю отладку, она указывает на line: 105 (и записывает «segmentation fault» в левом углу). Я не знаю, что означает красная линия в окне «Стек вызовов» ...Ошибка сегментации в функции

Пожалуйста, скажите waht, где и где я могу узнать больше об этом.

Вот код работы функции:

/* 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; 
} 

А вот sreenshot окон (проще показать это вместо того, чтобы пытаться описать)

enter image description here

ответ

1

Строка в красном - это ваш стек вызовов: в основном, это говорит о том, что проблема возникла внутри функции sepChannels_8(), которая была вызвана от main(). На самом деле у вас есть несколько ошибок в вашей функции 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, четное число, можно использовать malloc() выделить два блока хранения, каждый N/2 в размерах, и назначать их 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/2, а не от 0 до N. (Кроме того, вам нужно учесть этот последний элемент, если N был нечетным ...). Кроме того, вы используете m и i за то же самое в одно и то же время. Один из них не нужен, и лишний, и не нужен, и дополнительный.

return LRChannels; 
} 

И вернуть LRChannels-структуру, которая была передана в функцию, в неизменном виде. В то же время вы отбрасываете переменные L и R, которые содержат указатели на malloc() -распределенное хранилище, которое теперь потеряно.

Что было L и R Предполагалось быть? Похоже, что они должны быть unsigned char **, чтобы вы могли вернуть выделенное хранилище обратно вызывающему, сохранив указатели через них ... или, возможно, struct LandR имеет два элемента, которые являются указателями, и вы намеревались сэкономить L и R в структуре, прежде чем возвращать его? для L и R и LRChannels, я не понимаю, почему вы передаете их функции. Вы можете также сделать все автоматические переменные внутри функции так же, как int i и int m.

0

Вы malloc ред N/2 элементы в массиве, но в цикле, ваш счетчик идет от 0 до N. И это будет означать, что вы пытаетесь получить доступ к элементам от 0 до N, потому что вы увеличиваете m на каждой итерации. Очевидно, вы получите ошибку seg.

0

Какова ценность «smp»?

Это либо должно быть выделено до вызова sepChannels_8(), либо указать на действительный заполнитель.