【问题标题】:Debugger: "cannot open file: malloc.c"调试器:“无法打开文件:malloc.c”
【发布时间】:2016-12-08 23:25:55
【问题描述】:

我正在用 C 编写一个哈希游戏,我正在使用 malloc 为表分配内存。但是,当我编译程序时,我遇到了分段错误。使用调试器我发现了一个错误:显然,我不能使用 malloc,因为它找不到 malloc.c 或类似的东西。这是代码(发生段错误的地方):

int inicializaTabuleiro(char *ptrTabuleiro)
{
    //Aloca memória para o tabuleiro
    ptrTabuleiro = malloc(9);

    //Verifica se a memória foi alocada
    if(!ptrTabuleiro)
        return 0;

    int contadorPosicao;

    //Preenche o tabuleiro com '-'
    for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
            ptrTabuleiro[contadorPosicao] = '-';

    return 1;
}

对可能导致它的原因有什么想法吗?附加信息:在 Linux Mint 上使用带有 GCC 编译器的代码块。感谢您的宝贵时间!

【问题讨论】:

  • 相信我,你不需要看 malloc.c;错误不存在。它是在你的代码中,当你写出数组的边界时。
  • 您可能正试图进入malloc 源代码,而调试器不知道它在哪里。请放心,您的段错误不是由 malloc.c 中的有问题的代码引起的 .. 是您的代码导致了段错误。只需使用“next”或“n”(不是“step”或“s”)跳过对 gdb 中的 malloc 的调用。如果它在malloc 行崩溃,您可能在到达那里之前有一些未定义的行为。
  • 只要让gdb运行代码,它会在segfault所在的地方中断

标签: c linux malloc


【解决方案1】:

问题不在您的代码 sn-p 内部,大部分情况下这很好。问题是您没有将指针返回给调用者!在 C 中,参数是按值传递的,所以如果你这样做:

char *arr;
mycharalloc(arr);
arr[3] = 'X'; /* <-- arr is still uninitialized! */

mycharalloc 使用其本地副本 arr 来存储新创建的指针,但在调用者 arr 内部保持不变。因此,arr 是一个随机指针,下次向它写入内容时,会出现段错误。

我建议将您的功能更改为:

char *inicializaTabuleiro()
{
    //Aloca memória para o tabuleiro
    char *ptrTabuleiro = malloc(9);

    //Verifica se a memória foi alocada
    if(!ptrTabuleiro)
        return NULL;

    int contadorPosicao;

    //Preenche o tabuleiro com '-'
    for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
            ptrTabuleiro[contadorPosicao] = '-';

    return ptrTabuleiro;
}

然后在调用者中:

char *myTable = inicializaTabuleiro();
if (!myTable)
    error();

【讨论】:

  • 推荐(void)作为参数列表,即没有参数。空括号表示未指定数量的参数。
【解决方案2】:

您显然正在初始化将在函数外使用的东西。所以你需要多一层的间接性。将指针类型更改为char**

int inicializaTabuleiro(char **ptrTabuleiro)
{
    //Aloca memória para o tabuleiro
    *ptrTabuleiro = malloc(9);

    //Verifica se a memória foi alocada
    if(!*ptrTabuleiro)
        return 0;

    int contadorPosicao;

    //Preenche o tabuleiro com '-'
    for(contadorPosicao = 0; contadorPosicao < 9; contadorPosicao++)
            (*ptrTabuleiro)[contadorPosicao] = '-';

    return 1;
}

然后这样调用:

char *ptrTabuleiro;
if( inicializaTabuleiro( &ptrTabuleiro ) )
{
    /* now you can use ptrTabuleiro */
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2015-12-21
    • 2013-03-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多