简体   繁体   English

为什么此打印语句阻止程序在C中崩溃?

[英]Why does this print statement stop program from crashing in C?

I have the following program which first stores the direct flights between some cities and then uses DFS to query if two cities are connected by indirect flights. 我有以下程序,该程序首先存储某些城市之间的直飞航班,然后使用DFS查询两个城市是否通过间接航班连接。

The program kept crashing during the query step, so I tried to find the problem using print statements and strangely the program does not crash when there is a print statement in the function that carries out the searching. 程序在查询步骤中一直崩溃,因此我尝试使用打印语句查找问题,奇怪的是,当执行搜索的函数中存在打印语句时,程序也不会崩溃。 What is wrong with the code? 代码有什么问题?

(I am using Code:Blocks 13.12) (我正在使用代码:块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;
}

In inChecked() , you never initialize i , so your function will behave randomly. inChecked() ,您永远不会初始化i ,因此您的函数将随机运行。 If that function returns false too many times, you might overflow your checked array later on. 如果该函数多次返回false,则稍后可能会使checked数组溢出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM