【问题标题】:Segmentation Fault after slightly modifying my code稍微修改我的代码后出现分段错误
【发布时间】:2010-11-22 20:32:35
【问题描述】:

我将复制相关行:

(声明)

typedef struct { /* per una entrada de la taula de posicion */
    int f;
    int c;
} pos;
pos *p_opo[9];

(主要)

for (i = 0; i < num; i++) {
        p_opo[i] = (pos *) calloc(n_fil * n_col / 2, sizeof (pos)); 
    }

现在,在只引入了这一行之后,代码会在任意点中断(在对给定库函数的调用中)。我怀疑我用这个破坏了一些东西,虽然我不知道是什么。

我想要的只是一个可变大小数组的数组!

PD: num 是程序的一个参数。反正我一直在用 num=1 运行它。

【问题讨论】:

  • 编辑了帖子。 num 是程序的参数。我现在使用 num = 1 执行此操作并收到错误。
  • 如果 num
  • 它中断了对库函数的调用,该函数在我修改它之前一直运行良好。更糟糕的是,该函数甚至不会与 p_opo 混淆!
  • 如果 num 是“程序的参数”,你是从 argv 得到的吗?您是否使用 atoi 将 num 的字符表示从 argv 转换为 int?
  • 是编译错误还是运行时错误,如果是,是什么错误?那种有用的信息……还有,发生错误时调用的函数/代码……你用过调试器吗?

标签: c arrays pointers segmentation-fault


【解决方案1】:

num 应该小于或等于 9。(在 p_opo 中分配的 0..8 个指针等于 9!)

请注意,在 C 语言中,如果发生内存泄漏等情况,您会在不同的地方出现错误。原因是通过更改某些代码,可以重新排列其他代码或数据,这可能会导致分段错误。

所以问题很可能出在程序的另一部分。确保你打开了所有的警告(比如 gcc 中的 -Wall 选项),它可能会给你一些线索。

【讨论】:

  • num=1 用于我的测试。这正是我所说的“突破任意点”的意思。我已经打开了 -Wall 选项。编译时没有错误和警告...
  • @Hallucynogenyc 从 gdb 运行你的程序。当您遇到分段错误时,请使用“bt”(回溯)命令来追踪哪里出了问题。
  • 没有安装gdb,我也安装不了。阅读以上内容以了解原因。
【解决方案2】:

如果您对calloc 的调用请求大小为0 的内存,它可能会返回NULL,如果您正在使用该内存,则可能会导致分段错误。所以如果:

 0 == (n_fil * n_col / 2)

或以某种方式

0 == sizeof (pos)            /* I don't think that this is possible */

你请求的内存大小是0,所以calloc可以返回NULL。

如果不是这种情况,那么我认为您没有足够的代码让任何人知道它为什么会出现段错误。您应该记住,在您添加或更改一些似乎与发生实际错误的代码完全无关的代码之前,此类错误可能会被忽视。

【讨论】:

    【解决方案3】:

    看到你投出calloc 的回报让我怀疑。不要这样做,如果您忘记了系统函数的包含,这会导致典型的错误。

    如果您使用的是具有 64 位指针和 32 位 int 的计算机,则会发生这种情况。

    【讨论】:

    • @Hallucynogenyc:如果没有演员表,你肯定会遇到同样的错误。这个想法是,没有它,任何体面的编译器都应该给你一个坦率的警告。我想你用-Wall 或类似的东西编译?而且您的编译器根本没有任何警告?
    • 就是这样。所以我可以安全地将演员阵容保持在原来的位置?
    • 你真的不应该做演员表。这不是 C++
    猜你喜欢
    • 2011-05-09
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多