【问题标题】:Accessing an Array in a Function C在函数 C 中访问数组
【发布时间】:2012-09-30 10:37:26
【问题描述】:

我有一个 typedef 结构数组。

声明如下:

vertex vertexArray[numberVertices];

然后我的主代码中有这个:

 for(i=0;i<numberVertices;i++)
        {
                if(vertexArray[i].source == 5)
                {
                        source = vertexArray[i].number;
                        walk(vertexArray, vertexArray[i], source, headMaxPairList );
                }
        }

有希望地进行步行:

    void walk(vertex *vertexArray, vertex v, int source, maxPairing *head)
{
    int i;
    adjEdge *traverse;
    int moveVertex;
    int sink;




            moveVertex = vertexArray[v.number-1].number;
            if(vertexArray[moveVertex-1].color != 5 && vertexArray[moveVertex-1].sink == 5)
            {
                    sink = vertexArray[moveVertex-1].number;
                    vertexArray[moveVertex-1].color = 5;
                    addMaxPair(head, source, sink);
            }
            else
            {
                    walk(vertexArray, vertexArray[moveVertex-1], source, head);
            }

}

但是,我在函数上遇到了段错误:

in walk (vertexArray=Cannot access memory at address 0x7fffff3fefe8

我相信这与我传递 vertexArray 的方式有关。

据我了解,数组实际上是指针,因此 vertex *vertexArray 然后单个成员只是一个顶点,而不是指针,因此 vertex v

如果有人能帮助我正确通过,我将不胜感激。

旁注,如果有人能判断我的步行是否可以正常工作,那就太好了!

【问题讨论】:

  • 数组实际上并不是指针。它们有一些相似之处,但两者不可互换。有些人称它们为 constant 指针,但我认为这是用词不当并会导致混淆。数组就是数组。
  • @DavidTitarenco 话虽如此,有没有办法在 C 中传递像我这样的数组?
  • 有无数资源概述了如何在 C(++) 中传递数组。例如,请参阅stackoverflow.com/questions/2559896/how-are-arrays-passed
  • @DavidTitarenco 是的,我现在明白了。然而,事实证明,无论出于何种原因,我在 walk 中使用的递归都因再次传递数组而失败。通过注释掉它的递归行。那么如何处理递归的建议?

标签: c arrays function parameter-passing


【解决方案1】:

数组与指针不同。

阅读以下链接以进行澄清:

问:那么 C 中的“指针和数组等价”是什么意思?

http://c-faq.com/aryptr/aryptrequiv.html

问:但是我听说 char a[] 和 char *a 是一样的。

http://c-faq.com/aryptr/aryptr2.html

为避免 Seg-Fault,请在 walk() 函数中添加以下检查:

void walk(vertex *vertexArray, vertex v, int source, maxPairing *head)
{
    int i;
    adjEdge *traverse;
    int moveVertex;
    int sink;


    /* Add this Check to Avoid Seg Fault, you need to make the value of  
      'numberVertices'available to this function as this is your array size */

    if ((((v.number-1)<0)||((v.number-1)>numberVertices))
    {
       return;
    }
    /* Check Ends */

            moveVertex = vertexArray[v.number-1].number;

    /* Another Check */
    if((moveVertex-1<0)||(moveVertex-1>numberVertices))
    {
       return;
    }
    /* Check Ends */

            if(vertexArray[moveVertex-1].color != 5 && vertexArray[moveVertex-1].sink == 5)
            {
                sink = vertexArray[moveVertex-1].number;
                vertexArray[moveVertex-1].color = 5;
                addMaxPair(head, source, sink);
            }

            else
            {
                    walk(vertexArray, vertexArray[moveVertex-1], source, head);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2014-02-23
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多