[英]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.