【发布时间】:2019-04-23 21:25:24
【问题描述】:
大家好,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int power(int a, int b) {
int exponent = b, result = 1;
while (exponent != 0) {
result = result * a;
exponent--;
}
//printf("%d",result);
return result;
}
int fill_it(char ** p, int N, int fliptimes, int column2) {
if (N < 0) return 0;
int counter = 0, l;
char a = 'H';
for (l = 0; l < power(2, fliptimes); l++) {
p[l][column2] = a;
counter++;
if (counter == (power(2, N) / 2)) {
counter = 0;
if (a == 'H') a = 'T';
if (a == 'T') a = 'H';
}
}
fill_it(p, N--, fliptimes, column2++);
}
int main() {
int i, fores, j, l, m;
char ** p;
printf("how many times did you toss the coin?:");
scanf("%d", & fores);
p = (char ** ) malloc((power(2, fores)) * sizeof(char * ));
for (i = 0; i < fores; i++)
p[i] = (char * ) malloc(fores * sizeof(char));
fill_it(p, fores, fores, 0);
for (l = 0; l < power(2, fores); l++) {
for (m = 0; m < fores; m++) {
printf("%c", p[l][m]);
}
}
printf(",");
}
它确实可以编译。但是当我运行程序时它返回“分段错误(核心转储)”错误
我知道这意味着我试图访问内存,我没有访问权限,但我不明白程序的哪个部分有缺陷
【问题讨论】:
-
(与 seggie 无关,但
if (a == 'H') a = 'T'; if (a == 'T') a = 'H';在这两种情况下都会变成a == 'H'。你需要一个else在这里。) -
在调试器(即 gdb)中运行您的代码,它会告诉您代码崩溃的位置
-
Valgrind 是你的朋友,当你必须找到内存错误时,你应该尝试一下
-
(你递归地调用 'fill_it',但是你在这里有一个尾递归,你可以把它变成一个循环。在我看来,如果有两个嵌套循环,函数会更清晰。)
-
@MOehm 在递归调用中
column2++也有类似的问题
标签: c arrays pointers segmentation-fault coredump