为什么这个print语句会阻止程序在C中崩溃?

时间:2015-03-16 00:29:52

标签: c struct crash printf depth-first-search

我有以下程序,首先存储一些城市之间的直达航班,然后使用DFS查询两个城市是否通过间接航班连接。

程序在查询步骤中一直崩溃,所以我试图使用print语句找到问题,奇怪的是当执行搜索的函数中有print语句时程序不会崩溃。代码有什么问题?

(我正在使用代码:块13.12)

#include <stdio.h>
#include <stdlib.h>

#define MIN_SIZE 2
#define MAX_SIZE 10000
#define MIN_CON 1
#define FALSE 0
#define TRUE 1

//global variables
struct city** checked;
int* num_connect;
int n, found=0;

//Define a struct
struct city
{
    //Declaration of struct members
    int name;
    struct city **connected; //array of all cities with direct flights to
};

int readCity(int n)
{
    //Declaration of a variable
    int city;

    do
    {
        scanf("%d", &city);
    }while(city<MIN_CON && city>n);
    return city;
}

void addFlight(struct city *list, int orig, int dest)
{
    //decl
    int i=0;
    int j=0;

    //check if orig is in list
    while(num_connect[i]!=0 && list[i].name!=orig)
    {
        i++;
    }

    //if it isnt add it
    if (num_connect[i]==0)
    {
        list[i].name =orig;
        list[i].connected = malloc((num_connect[i]+1)*sizeof(struct city*));
    }
    else
    {
         //reallocate memory to store additional flight connection
        list[i].connected = realloc(list[i].connected, (num_connect[i]+1)*sizeof(struct city*));
    }

    num_connect[i]++;

    //check if dest is in list
    while(num_connect[j]!=0 && list[j].name!=dest)
    {
        j++;
    }

    //if it isnt add it
    if (num_connect[j]==0)
    {
        list[j].name =dest;
        list[j].connected = malloc((num_connect[j]+1)*sizeof(struct city*));
    }
    else
    {
         //reallocate memory to store additional flight connection
        list[j].connected = realloc(list[j].connected, (num_connect[j]+1)*sizeof(struct city*));
    }

    num_connect[j]++;

    //add b to a's connected and add b to a's connected
    list[j].connected[num_connect[j]-1]=&list[i];
    list[i].connected[num_connect[i]-1]=&list[j];

    printf("JUST CONNECTED %d WITH %d\n", list[i].name, list[j].name);
}

int inChecked(struct city* c)
{
    int i;

    while(checked[i]!=c && i<n)
    {
        i++;
    }

    if (i==n)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

void search_connection(struct city *list, int orig, int dest)
{
    //decl
    int i=0, k=0, j=0, p=0;

    printf("   ");  // <------------------------------------------------------------

    //Find origin city in list
    while(i<n && list[i].name!=orig)
    {
        i++;
    }

    //add to checked
    while(checked[k]!=NULL)
    {
        k++;
    }
    checked[k]=&list[i];

    //Check for 'dest' city in connected of origin
    while(j<num_connect[i] && list[i].connected[j]->name!=dest)
    {
        j++;
    }

    //If-statement to determine if dest was found
    if (j!=num_connect[i])
    {
        //Set 'found' to 1
        found=1;
        return;
    }
    else
    {
        //While not all connected have been checked and not found
        while(p<num_connect[i] && found==0)
        {
            if (!inChecked(list[i].connected[p]))
            {
                //call method on it
                search_connection(list, list[i].connected[p]->name, dest);
            }
            p++;
        }
    }
}

int main()
{
    //Declaration of variables
    int i, m;
    int city_a, city_b, q_result;

    //Read input
    do
    {
        //printf("Enter number of cities:\n");
        scanf("%d", &n);
    }while(n<MIN_SIZE || n>MAX_SIZE);

    //Declare an array of cities
    struct city* cities;

    //Allocate memory for array of 'n' cities
    cities = malloc(n*sizeof(struct city)); // <---------------- FREE later!!!

    //Allocate memory for array of 'n' pointers to cities
    checked = calloc(n,sizeof(struct city*)); // <---------- FREE later!!!

    //Allocate memory for array of 'n' integers
    num_connect = calloc(n,sizeof(int)); // <------------ FREE later!!!

    //Read input
    do
    {
        //printf("Enter number of connections:\n");
        scanf("%d", &m);
    }while(n<MIN_SIZE || n>MAX_SIZE);

    //For-loop to read connected cities
    for (i=0; i<m; i++)
    {
        //Read two cities
        city_a = readCity(n);
        city_b = readCity(n);

        //add flight connecting the two cities
        addFlight(cities, city_a, city_b);
    }

    //Read connection to query
    city_a = readCity(n);
    city_b = readCity(n);

    //Search for connection between the two cities by in-direct flight
    search_connection(cities, city_a, city_b);

    //Print results
    if (found==1)
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }

    //Free up memory
    //  TO DO. . .

    return 0;
}

1 个答案:

答案 0 :(得分:2)

inChecked()中,您永远不会初始化i,因此您的函数会随机运行。如果该函数返回false太多次,则稍后可能会溢出checked数组。