C - 应用于矩阵的函数指针。分段错误

C - Function pointer applied to matrix. Segmentation fault error

我明白什么是分段错误,但我不明白为什么我会得到它。

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

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 循环。

感谢您的帮助!

execOnMatrix

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

char (*fptr)(char)

作为参数,但是你用 swapPercent 的地址调用它,它的类型是

int (*f)(char*)

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

execOnMatrix(swapPercent());

正在调用函数 swapPercent。这应该是

execOnMatrix(swapPercent);

或等同于

execOnMatrix(&swapPercent); 

这些函数类型

int swapPercent(char * loc );

char (*fptr)(char);

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

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

execOnMatrix(&swapPercent);

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

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

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

我建议应该这样

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

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