【问题标题】:Segmentation fault when using pointers in between functions在函数之间使用指针时出现分段错误
【发布时间】:2019-03-31 02:35:51
【问题描述】:

将存储在指针中的值分配给函数中的局部变量时,我遇到了分段错误。我有一种预感,我处理指针很差,但我似乎无法弄清楚问题是什么。有任何想法吗?谢谢!

我尝试添加断点,并确定实际的段错误发生在“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;

【问题讨论】:

  • 使用align_S_T函数时,给参数AlignCounter的值是多少?
  • 你认为你被允许访问0x0的内存位置吗(在系统保留内存范围的最底部)?你认为那里存储了什么? int i = *AlignCounter; //&lt;--Seg Fault Line 很好地表明了第一个问题的答案。换句话说,AlignCounter=0;地址 0 存储为 AlignCounter 的值,当您尝试访问您无权访问的内存位置时,BAM SegFault。
  • 在使用align_S_T函数之前,您是否为AlignCounter分配了动态内存?
  • @Miguel,不,我刚刚声明了指针。
  • 当您尝试取消引用指向无处的指针时,您认为会发生什么?

标签: c pointers


【解决方案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);
}

【讨论】:

    【解决方案2】:

    我已经隔离了您的问题,您需要在调用函数align_S_T 之前将动态内存或静态分配给AlignCounter 变量,如下面的代码所示。

    #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;使其为 NULL。如果您随后将其发送到 align_S_T,那么您只是在引用一个 NULL 指针。轰隆隆。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        • 2020-12-27
        • 2020-10-04
        相关资源
        最近更新 更多