【问题标题】:C - Function pointer applied to matrix. Segmentation fault errorC - 应用于矩阵的函数指针。分段错误错误
【发布时间】:2016-02-21 21:03:07
【问题描述】:

我了解什么是分段错误,但我不明白为什么会这样。

所以下面我定义了一个函数,它接受一个 char 指针并检查它是否是某个字符,然后如果它是指定的字符则替换它。

int swapPercent(char * loc){
if (strcmp(loc, "%") == 0){
*loc = '#';
}
}

那么下面是函数指针函数,将函数应用于矩阵中的每个元素:

int execOnMatrix(char (*fptr)(char)){
int a;
int b;
for (a = 0; a < 10; a = a +1){
  for (b = 0; b < 10; b=b+1){
    (*fptr)(matrixOne[a][b]);
  }
}
}

最后,这里是我调用函数 execOnMatrix 的地方。这是在一个单独的函数中,我在其中迭代矩阵(它是一个基于玩家运动的游戏):

if (matrixOne[a][b] == '+'){
execOnMatrix(swapPercent());
}

编辑: 矩阵如下:

char map[10][10];

上面代码中的“a”和“b”来自一个访问矩阵中每个元素的for循环。

感谢您的帮助!

【问题讨论】:

  • 你在哪里以及如何调用它时遇到分段错误?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 上下文不够,但您的意思是if (*loc == '%') 吗?

标签: c pointers matrix segmentation-fault function-pointers


【解决方案1】:
execOnMatrix

被定义为获取指向函数获取字符的指针:

char (*fptr)(char)

作为参数,但您使用swapPercent 类型的地址调用它

int (*f)(char*)

此外,即使类型正确,您也会错误地调用 execOnMatrix

execOnMatrix(swapPercent());

调用函数swapPercent。这应该是

execOnMatrix(swapPercent);

或等效

execOnMatrix(&swapPercent); 

【讨论】:

    【解决方案2】:

    这些函数类型

    int swapPercent(char * loc );
    

    char (*fptr)(char);
    

    不兼容。这就是问题的原因。

    【讨论】:

      【解决方案3】:

      您正在调用 swapPercent 函数,而不是将其作为参数传递。写:

      execOnMatrix(&swapPercent);
      

      &amp; 是可选的,但更清楚地表明您打算传递函数的地址。

      【讨论】:

        【解决方案4】:

        一个错误的线索(至少)在于您替换字符的方式。

        int swapPercent(char * loc){
            if (strcmp(loc, "%") == 0){
                *loc = '#';
            }
        }
        

        我建议应该这样

        int swapPercent(char * loc) {
            if (*loc == '%') {
                *loc = '#';
            }
        }
        

        但是,该函数仍然缺少返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 2021-02-22
          • 1970-01-01
          • 2013-09-18
          • 2016-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多