PDA

View Full Version : [C] Problemi con malloc su matrice (fatta male?)


fbcyborg
25-03-2011, 11:51
Salve a tutti,

so dov'è il problema nel codice che segue, ma non riesco a correggerlo.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
int i,j=0;
int multiplication = 0;
int n_cpu = 8;
int ops_per_thread = 16;
int **intervals;
int num_blocks = 1024;

intervals = (int**)malloc( n_cpu * sizeof(int) );
for(i=0; i<n_cpu; i++)
intervals[i] = (int*)malloc( 2 * sizeof(int) );

for(i=0;i<n_cpu;i++){
multiplication = ops_per_thread*i;
intervals[i][0] = multiplication;
if(i==n_cpu-1){// The last thread gets also the remaining
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication + (num_blocks % n_cpu);
}else{
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication;
}
}

printf("The matrix is:\n");
for (i = 0; i < n_cpu; i++) {
for (j = 0; j < 2; j++)
printf("%6d ", intervals[i][j]);
printf("\n");
}
return 1;
}

Questo semplicissimo programma ha come obiettivo quello di stampare una matrice 8x2 con una serie di valori, che sono i seguenti:
The matrix is:
0 15
16 31
32 47
48 63
64 79
80 95
96 111
112 127
Ho scoperto che se nel ciclo for, sostituisco n_cpu con "6", la matrice viene stampata ma senza le ultime due righe. In caso contrario, va in segmentation fault non appena tenta di scrivere la settima riga.
Deduco quindi che sia un problema di scrittura in memoria non allocata, ma non capisco perché. Eppure fin'ora ho sempre allocato le matrici in questo modo. Perché (se è così) le ultime due righe non vengono allocate? :muro: :muro:
Eppure il ciclo di allocazione iniziale, arriva fino a 7. Se ci fosse qualche errore in allocazione dovrebbe uscire fuori, o sbaglio?

wingman87
25-03-2011, 12:07
...
intervals = (int**)malloc( n_cpu * sizeof(int*) );
...

Ho dato solo un'occhiata velocissima, potrebbero esserci altri errori.

fbcyborg
25-03-2011, 12:23
Grande,

grazie infinite! Ora funziona bene. Ti devo una birra!