Originariamente inviata da
DaemonDestroyer
Si ha ragione, mi sono espresso male, ho modificato il messaggio.
Ecco è questo il problema, l'allocazione dinamica con malloc... pur avendo visto diversi esempi sul libro e su internet non mi è proprio chiaro come essa funzioni, e da dove devo partire innanzitutto!
In C++ puoi anche usare new e delete (o new[] e delete[]).
In ogni caso malloc ritorna un puntatore a un blocco di memoria che ha dimensione in bytes pari all'unico argomento della funzione:
codice:
void *p_blocco = malloc(n);
p_blocco è un puntatore a un blocco di memoria di n bytes.
Per essere utile tuttavia bisogna fare alcune considerazioni:
sizeof ritorna le dimensioni in bytes dell'argomento:
ad esempio sizeof(char) ritornerà sempre 1, sizeof(type *) ritorna le dimensioni in bytes di un puntatore (8 su 64bit, 4 su 32bit, 2 su 16bit)
dunque sizeof(tipo) ti da il numero di byte di un elemento, moltiplichi questo per il numero degli elementi e ottieni il numero di byte del blocco.
per utilizzare il blocco alla fine ti serve un cast al puntatore di tipo.
Ad esempio per allocare un array di interi di n elementi servirà
codice:
int *array = (int *)malloc( sizeof(int) * n );
Ti allego la soluzione dell'esercizio che è un esempio di allocazione dinamica:
codice:
#include <iostream>
#include <fstream>
//necessario se usi malloc e free, non necessario altrimenti
#include <cstdlib>
using namespace std;
int **readMat(int**&m, size_t& size, ifstream& in) {
in >> size;
m = new int *[size];
for(int i = 0; i < size; ++i)
m[i] = new int[size];
for(int i = 0; i < size; ++i)
for(int j = 0; j < size; ++j)
in >> m[i][j];
return m;
}
int **readMat1(int **&m, size_t& size, ifstream &in) {
in >> size;
m = (int **)malloc(sizeof(int *) * size);
for(int i = 0; i < size; ++i)
m[i] = (int *)malloc(sizeof(int) * size);
for(int i = 0; i < size; ++i)
for(int j = 0; j < size; ++j)
in >> m[i][j];
return m;
}
void freeMat(int **&m, size_t size) {
for(int i = 0; i < size; ++i)
delete[] m[i];
delete[] m;
}
void freeMat1(int **&m, size_t size) {
for(int i = 0; i < size; ++i)
free(m[i]);
free(m);
}
int main(void) {
ifstream in("input.txt");
size_t size;
int **m;
readMat1(m, size, in);
for(int i = 0; i < size; ++i) {
for(int j = 0; j < size; ++j)
cout << m[i][j] << '\t';
cout << endl;
}
freeMat1(m, size);
return 0;
}