Ошибка сегментации при использовании указателей между функциями

#c #pointers

#c #указатели

Вопрос:

Я получаю ошибку сегментации при присвоении значения, хранящегося в указателе, локальной переменной в функции. У меня есть подозрение, что я плохо обрабатываю указатели, но, похоже, я не могу понять, в чем проблема. Есть идеи? Спасибо!

Я попытался добавить точки останова, и я определил, что фактическая ошибка сегментации происходит в «int i = * AlignCounter;»

При просмотре окна переменных я вижу это: Окно переменных в отладчике VSC

Вот функция, в которой возникает ошибка сегментации:

 void align_S_T(int *StringCounterS, int 
*StringCounterT, int *AlignCounter, char *StringS, char 
*StringT, char *AlignmentS, char *AlignmentT)
{
//Local Variables
int i = *AlignCounter; //<--Seg Fault Line
int s = *StringCounterS;
int t = *StringCounterT;
//Set Strings
AlignmentS[i] = StringS[s];
AlignmentT[i] = StringT[t];

//Increment Counters
*AlignCounter  ;
*StringCounterS  ;
*StringCounterT  ;

}
  

Вот как создаются и распределяются указатели в main:

     int* StringCounterT; //T String Counter
    int* AlignCounter; //Align Counter

    StringCounterS=0;
    StringCounterT=0;
    AlignCounter=0;
  

Комментарии:

1. Какие значения присваиваются параметру AlignCounter при использовании функции align_S_T?

2.Как вы думаете, вам разрешен доступ к ячейке памяти в 0x0 (в самом низу диапазона памяти, зарезервированного системой)? Как вы думаете, что там хранится? int i = *AlignCounter; //<--Seg Fault Line это хороший признак ответа на первый вопрос. Другими словами, AlignCounter=0; сохраняет адрес 0 как значение для AlignCounter , и когда вы пытаетесь получить доступ к ячейке памяти, к которой у вас нет права доступа, BAM SegFault.

3. перед использованием align_S_T функции вы выделили динамическую память для AlignCounter ?

4. @Miguel, нет, я только что объявил указатель.

5. Как вы думаете, что происходит, когда вы пытаетесь разыменовать указатель, указывающий в никуда?

Ответ №1:

Вы указываете, что AlignCounter указывает на адрес 0 (AlignCounter=0;), затем внутри align_S_T() вы пытаетесь получить значение, хранящееся внутри этого адреса, с помощью оператора «*» (int i = *AlignCounter;). Вы не можете этого сделать, потому что это недопустимый адрес (попробуйте указать AlignCounter на объявленное целое число перед вызовом align_S_T(), ошибка сегмента переходит к следующей строке, rss, то же самое).

 void align_S_T(int *StringCounterS, int 
*StringCounterT, int *AlignCounter, char *StringS, char 
*StringT, char *AlignmentS, char *AlignmentT)
{
//Local Variables
int i = *AlignCounter;
int s = *StringCounterS;  //<--Seg Fault Line!!
int t = *StringCounterT;
//Set Strings
AlignmentS[i] = StringS[s];
AlignmentT[i] = StringT[t];

//Increment Counters
*AlignCounter  ;
*StringCounterS  ;
*StringCounterT  ;

}

int main(int argc, char *argv[]){
     int* StringCounterT; //T String Counter
     int* StringCounterS; //T String Counter
     int* AlignCounter; //Align Counter
     char *a, *b, *c, *d;
     int x;

     a = b = c = d = "";
     x = 10;

     StringCounterS=0;
     StringCounterT=0;
     AlignCounter=amp;x;  

     align_S_T(StringCounterS, StringCounterT, AlignCounter, a, b, c, d);
     return(0);
}
  

Ответ №2:

Я выделил вашу проблему, вам нужно назначить динамическую память или статическую AlignCounter переменной перед вызовом функции align_S_T , как вы можете видеть в следующем коде.

 #include <stdio.h>
#include <stdlib.h>

void  align_S_T(int *AlignCounter)
{
   int i = *AlignCounter;
   *AlignCounter  ;
}

int main()
{
   // Dynamic memory
   int *AlignCounter=NULL;
   AlignCounter = (int*) malloc(10 * sizeof(int)); 
   *AlignCounter=0;
   // static memory
   // int AlignCounter[buffer_needed];
   // AlignCounter[0]=0;
   function(AlignCounter);
   free(AlignCounter);

   return 0;
}
  

Я надеюсь, что это поможет вам.

Ответ №3:

Ну, int* AlignCounter создает указатель, но не выделяет ничего, на что он мог бы указывать. Тогда AlignCounter=0; делает его нулевым. Если вы затем отправляете его в align_S_T, вы просто ссылаетесь на нулевой указатель. Бум.

Вероятно, вы хотите объявить int AlignCounter = 0, затем отправить amp;AlignCounter в вашу функцию.