在最短路径C代码中查找分段故障11的原因

在最短路径C代码中查找分段故障11的原因,c,xcode,C,Xcode,您好,我一直在编写一个代码来模拟最短路径算法,但我被卡住了,我一直得到分段错误11错误这里是我的代码 #include <curses.h> #include<math.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<math.h> int size = 20; #define IN 99 char * strrev (ch

您好,我一直在编写一个代码来模拟最短路径算法,但我被卡住了,我一直得到分段错误11错误这里是我的代码

#include <curses.h>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>


int size = 20;


#define IN 99



char *
strrev (char *str)
{
    if (!str) {
        fprintf (stderr, "%s() Error: invalid string\n", __func__);
        return NULL;
    }

    char *begin = str;
    char *end = str + strlen (str) - 1;
    char tmp;

    while (end > begin)
    {
        tmp = *end;
        *end-- = *begin;
        *begin++ = tmp;
    }

    return str;
}

int dijsktra(int costMatrix[][size],int source,int target)

{

    int distance[size],previous[size],IsSelected[size],i,m,minimum,s,d,j;
    memset(IsSelected, 0, size*sizeof(IsSelected[0]));
    char pathMatrix[size];

    for(i=1;i<size;i++)

    {

        distance[i] = IN;

        previous[i] = -1;

    }

    s = source;

    IsSelected[s]=1;

    distance[s] = 0;

    while(IsSelected[target] ==0)

    {

        minimum = IN;

        m = 0;

        for(i=1;i<size;i++)

        {

            d = distance[s] +costMatrix[s][i];

            if(d< distance[i]&&IsSelected[i]==0)

            {

                distance[i] = d;

                previous[i] = s;

            }

            if(minimum>distance[i] && IsSelected[i]==0)

            {

                minimum = distance[i];

                m = i;

            }

        }

        s = m;

        IsSelected[s] = 1;

    }

    s = target;

    j = 0;

    while(s != -1)

    {

        pathMatrix[j++] = s+65;

        s = previous[s];

    }

    pathMatrix[j]='\0';

    strrev(pathMatrix);

    printf("%s", pathMatrix);

    return distance[target];

}



int main(int argc, char** argv)

{
    int siz = argc;
    int id, port;
    int N;
    int costMatrix[N][N], i, j, ch, co;
    int *data;
    int startNode, source, target,x,y;

    id = atoi(argv[1]);

    port = atoi(argv[2]);

    N = argc-1;
    data=(int*)calloc(size,sizeof(int));


    for (i=1;i<siz;i++)
    {
        data[i]=atoi(argv[i]);
        printf("%d\n",data[i]);
    }
    printf("%d", N);


    printf("\tDIJKSRTRA's ALGORITHM\n\n");


   /* for(i=1;i< N;i++)
        printf("%d ", i);
        for(j=1;j< N;j++)
            printf("%d ", j);
            costMatrix[i][j]=IN;

    for(x=1;x< N;x++)

    {

        for(y=x+1;y< N;y++)

        {

            printf("The weight of the path between router port %d and %d : %d",x,y, atoi(argv[y]));



            costMatrix [x][y] = costMatrix[y][x] = atoi(argv[y]);

        }

        printf("\n");

    }*/
    printf("yo");
    startNode = atoi(argv[2]);
    source = atoi(argv[3]);

    target = atoi(argv[5]);

    co = dijsktra(costMatrix,N,startNode);

    printf("\nShortest Path: %d",co);

}
#包括
#包括
#包括
#包括
#包括
#包括
int size=20;
#在99中定义
煤焦*
STREV(字符*str)
{
如果(!str){
fprintf(stderr,“%s()错误:无效字符串\n”,\uuuu func\uuuu);
返回NULL;
}
char*begin=str;
char*end=str+strlen(str)-1;
char-tmp;
while(结束>开始)
{
tmp=*结束;
*结束--=*开始;
*begin++=tmp;
}
返回str;
}
int-dijsktra(int-costMatrix[][size],int-source,int-target)
{
整数距离[size],先前的[size],IsSelected[size],i,m,最小值,s,d,j;
memset(IsSelected,0,size*sizeof(IsSelected[0]);
字符路径矩阵[大小];

对于(i=1;i如何调用该程序?局部变量(和函数参数)名称应指示
内容
用法
(或两者更好)像:
m
s
d
等名称即使在当前上下文中也毫无意义。发布的代码都是双倍行距的。这不是一种好的样式。建议使用单独的代码块:
用于
则切换
默认值
通过一个空行。用2或3个空行分隔函数(保持一致)一般来说,不要在代码中插入虚假的空行,以便于阅读和理解:1)遵循公理:每行仅一条语句,并且(最多)每个语句一个变量声明。2)插入一个合理的空格:在括号内、括号内、逗号后、分号后、C运算符周围。最好插入注释在代码中,它解释了部分代码的目标,因此代码的读者不必对代码进行反向工程来确定代码试图执行的操作。