在函数之间使用指针时出现分段错误

时间:2019-03-31 02:35:52

标签: c pointers

将指针中存储的值分配给函数中的局部变量时出现分段错误。我有一种直觉,就是我对指针的处理不佳,但是我似乎无法弄清楚问题是什么。有任何想法吗?谢谢!

我尝试添加断点,并且确定实际的段错误发生在“ int i = * AlignCounter;”。

当查看变量窗口时,我看到以下内容: Variables Window in VSC Debugger

以下是发生段错误的功能:

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;

3 个答案:

答案 0 :(得分:1)

您要指示AlignCounter指向地址0(AlignCounter = 0;),然后在align_S_T()内尝试使用“ *”运算符获取存储在该地址内的值(int i = * AlignCounter;)。您不能执行此操作,因为它不是有效地址(在调用align_S_T()之前尝试将AlignCounter指向已声明的整数,segFault转到下一行,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=&x;  

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

答案 1 :(得分:0)

我已经解决了您的问题,如下面的代码所示,在调用函数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;
}

希望对您有帮助。

答案 2 :(得分:0)

好吧,int * AlignCounter创建一个指针,但是不分配任何指向它的指针。然后AlignCounter = 0;使它为NULL。如果然后将其发送到align_S_T,则仅引用NULL指针。景气。

您可能要声明int AlignCounter = 0,然后将&AlignCounter发送到您的函数。