I'm writing this code in C to implement a genetic algorthm. This is the part where I do the dynamic allocation of all the working structures (matrices and vectors). When I run this, sometimes (3 times on 5) it crashes. I'm doing something wrong with the allocation?
int main()
{
const char progress[] = "|/-\\";
int n, popSize, numIter,optRoute,minDist,range,globalMin,idx;
int maxcell;
int i,j,p,t,k,d,iter,perm,index,m;
int dists[4];
int* dmat, * totalDist, * distHistory, *randomOrder, *bestOf4Route;
int** pop, ** newPop, ** tmpPop, **rtes;
unsigned int iseed = (unsigned int)time(NULL);
// Values initialization
n = 5;
range = 10;
popSize = 100;
numIter = 1*10^4;
globalMin = 100000;
srand (iseed);
//printf("Insert the number of cities: ");
//scanf("%i",&n);
printf("Matrix costs creation...");
// Creates dmat NxN matrix
// dmat è una matrice triangolare superiore con diag = 0
// declare halfsize 1D array
maxcell = ((n*n)-n)/2;
dmat = (int*)malloc(maxcell * sizeof(int));
//set array
for(i=0; i<maxcell; i++)
dmat[i] = (rand()%10)+2;
printf("done.\n");
//print entire matrix
//print_triangmat(dmat,n);
printf("Creation of the pop matrix...");
// create popSize x N matrix
pop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
pop[i] = (int*)malloc(popSize * sizeof(int));
}
printf("done.\n");
printf("Pop matrix loading...");
// charge the first row of the matrix
for (j = 0; j < n; j++) {
pop[j][0] = j+1;
}
// charge the rest of the matrix with randperm of the first row
for (i = 0; i < popSize; i++)
{
for (j = 0; j < n; j++)
{
perm = rand()%(n-j)+j;
t = pop[perm][i];
pop[perm][i] = pop[j][i];
if(i!=popSize-1)
pop[perm][i+1] = pop[j][i];
pop[j][i] = t;
if(i!=popSize-1);
pop[j][i+1] = t;
}
}
print_matrix(pop,popSize,n);
printf("done.\n");
printf("Creation of the working structures...");
// create 4 x N matrix
rtes = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
rtes[i] = (int*)malloc(4 * sizeof(int));
}
// Creates an array of popSize
totalDist = (int*)malloc(popSize * sizeof(int));
// Creates an array of numIter
distHistory = (int*)malloc(numIter * sizeof(int));
// Creates an array of n
bestOf4Route = (int*)malloc(n * sizeof(int));
// create 4 x N matrix
tmpPop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
tmpPop[i] = (int*)malloc(4 * sizeof(int));
}
// create popSize x N matrix
newPop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
newPop[i] = (int*)malloc(popSize * sizeof(int));
}
// Creates an array of popSize
randomOrder = (int*)malloc(popSize * sizeof(int));
printf("done.\n");
Problem is here. Consider i=popsize-1 then you will write to pop[perm][popsize] which is an invalid memory position. Then when allocations below are requested, sometimes requested memory position is intersected with pop[perm][popsize] so you are getting the runtime error.
for (i = 0; i < popSize; i++) {
for (j = 0; j < n; j++) {
perm = rand()%(n-j)+j;
t = pop[perm][i];
pop[perm][i] = pop[j][i];
if(i!=popsize-1)
pop[perm][i+1] = pop[j][i];
pop[j][i] = t;
if(i!=popsize-1)
pop[j][i+1] = t;
}
}
On the other hand there many wrong memory allocations:
pop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < popSize; i++) {
pop[i] = (int*)malloc(popSize * sizeof(int));
}
should be
pop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
pop[i] = (int*)malloc(popSize * sizeof(int));
}
and
rtes = (int**)malloc(n * sizeof(int*));
for (i = 0; i < 4; i++) {
rtes[i] = (int*)malloc(4 * sizeof(int));
}
should be
rtes = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
rtes[i] = (int*)malloc(4 * sizeof(int));
}
and
tmpPop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < 4; i++) {
tmpPop[i] = (int*)malloc(4 * sizeof(int));
}
should be
tmpPop = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++) {
tmpPop[i] = (int*)malloc(4 * sizeof(int));
}
There is one more ambiguity in the problem.
numIter = 1*10^4;
This makes numIter 14 since ^ is logical XOR operator. Are you sure to want to do so?