【问题标题】:segmantation fault malloc pointers functions分段错误 malloc 指针函数
【发布时间】: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


【解决方案1】:

问题是,您没有分配足够的内存。这条线很好

p = (char ** ) malloc((power(2, fores)) * sizeof(char * ));

但这个循环只是为二维数组的一部分分配内存。

for (i = 0; i < fores; i++)
    p[i] = (char * ) malloc(fores * sizeof(char));

内存分配应该更像这样......

foresSquared = power(2, fores);
p = malloc(foresSquared*sizeof(char *));
for (i = 0; i < foresSquared; i++)
    p[i] = malloc(fores);

由于power 的结果将是一致的,因此将值存储在变量中并使用它而不是重新计算它是有意义的。它也会使代码更清晰。

您也不需要转换 malloc 的返回值,因为 C 会为您处理。并且sizeof(char) 不是必需的,因为它保证始终为 1。

【讨论】:

  • @Jean-MarcZimmer 看不到我正在执行的代码的固定版本中的哪个位置?
  • 哦,哎呀,我的错,我看错了。它在第一个代码部分。我真的很难理解书面的东西......
  • @ChrisTurner 非常感谢你,你让我开心! :-)
  • @dimitraaaa 如果我的回答是正确的,那么传统的做法是用打勾标记
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多