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 值。
我明白什么是分段错误,但我不明白为什么我会得到它。
所以下面我定义了一个函数,它接受一个字符指针并检查它是否是某个字符,如果是指定字符则替换它。
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 值。