访问函数C中的数组

时间:2012-10-10 02:37:16

标签: c arrays function parameter-passing

我有一个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);
            }

}

但是,我在函数上遇到了一个seg-fault:

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

我认为这与我传递vertexArray的方式有关。

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

如果有人能帮助我正确传递,我会很感激。

旁注,如果有人能说出我的步行看起来是否能正常工作那么多了!

1 个答案:

答案 0 :(得分:2)

数组与指针不同。

请阅读以下链接以获得澄清:

问:那么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);
            }