【问题标题】:Segmentation fault when traversing array in c在c中遍历数组时出现分段错误
【发布时间】:2011-08-10 15:22:18
【问题描述】:

我用c写了这个小函数:

void initializeArray(char arr[ROWS][COLS]){
    int i,j;
    for (i=0; i<COLS; i++){
        for (j=0; j<ROWS; j++){
            arr[i][j] = ' ';
        }
    }
}

编辑:ROWS 和 COLS 在头文件中定义

当我调用它时,我不断收到分段错误。如果我使用遍历数组 指针没问题,有什么想法吗?

附言 传递的数组是在函数外部定义的,因此没有链接问题。

【问题讨论】:

  • ROWS 和 COLS 设置为什么?你的数组有多大?
  • Marcelo 这实际上是问题所在!
  • 我们需要查看您传递的任何内容的调用和声明。请注意,参数声明中的COLS 维度没有任何意义;该参数实际上是一个指针,而不是一个数组。
  • @yotamoo:我的错。第一个和第二个索引的指针算法是不同的,所以是的,它确实解释了段错误。
  • @Marcelo:+1 评论承认错误。

标签: c segmentation-fault


【解决方案1】:

在你的函数声明中,ROWS 作为第一个维度的大小,COLS 作为第二个维度的大小;但在你的函数体中,你在第一个维度上循环 COLS 次,在第二个维度上循环 ROWS 次。根据数组声明是匹配函数声明还是代码中的“隐含声明”,这可能是个问题。

【讨论】:

  • 数组声明会如何影响这个?
【解决方案2】:

在函数声明中使用char arr[ROWS][COLS],在循环中使用arr作为arr[i][j],其中i用于循环直到COLSj用于循环直到ROWS .

您的COLSROWS 在这两种情况之间互换。

【讨论】:

  • 我给了你+1,但似乎你可以更好地表达这个,也许用一个代码示例来说明。这应该是公认的答案。
  • 我稍微重新表述了我的答案,希望现在措辞更好。除了这很奇怪(因此我的回答是它们被交换了),我想不出为什么这会导致分段错误。 OP 解决了这个问题的事实更加奇特......
  • 因为如果他的索引错误,他会访问一个无效的索引。
  • 是的,在阅读了 Marcelos 的回答后,我理解并认为我事先就知道自己了!
  • 这就是我试图让您通过代码示例演示的内容 :)
【解决方案3】:

您在循环中交换了 ROWS 和 COLS。

表达式arr[i][j] 等价于*(&amp;arr[0][0] + COLS*i + j),并且由于交换,最后一次访问变为*(&amp;arr[0][0] + COLS*(COLS - 1) + (ROWS - 1))

如果,例如,COLS 是 100,ROWS 是 50,那么最后访问的元素将是 100*99+49 = 9949 字节,但数组只有 5000 字节。反过来,最后一次访问变成了 100*49+99 = 4999,也就是数组的最后一个字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2017-11-24
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多