#c #pointers
#c #указатели
Вопрос:
Я получаю ошибку сегментации при присвоении значения, хранящегося в указателе, локальной переменной в функции. У меня есть подозрение, что я плохо обрабатываю указатели, но, похоже, я не могу понять, в чем проблема. Есть идеи? Спасибо!
Я попытался добавить точки останова, и я определил, что фактическая ошибка сегментации происходит в «int i = * AlignCounter;»
При просмотре окна переменных я вижу это:
Вот функция, в которой возникает ошибка сегментации:
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 в вашу функцию.