Malloc d'un tableau double entree

Fermé
Chris - 18 sept. 2004 à 12:36
 vai tahiti - 8 mars 2013 à 22:00
Bonjour,
je déclare ma matrice de taille n de cette façon:

float *m;
m=(float *)malloc(sizeof((float *)malloc(sizeof(float)*n))*n);

Pouvez-vous me dire comment je peux ensuite recupérer mes élements ? (m[i][j] ne marche pas ...)

Merci d'avance!
Chris.
A voir également:

4 réponses

Tant qu'on y est, faisons complet pour ne pas fâcher un puriste qui passerait par là :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned int n = 4, i, j;

    /* allocation mémoire pour le tableau de sous-tableaux :   */
    float** m = (float**) malloc(n * sizeof(float));

    /* allocation mémoire pour chaque sous-tableau de reels :   */
    for (i = 0; i < n; i++)
        m[i] = (float*) malloc(n * sizeof(float));

    /* affichage de chaque reel :                               */
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            printf("M[%d][%d] = %f\n", i, j, m[i][j]);

    /* désallocation mémoire de chaque sous-tableau de reels :  */
    for (i = 0; i < n; i++)
        free(m[i]);

    /* désallocation mémoire du tableau de sous-tableaux :   */
    free(m);

    return 0;
}
19
Bonjour,
je n'ai qu'une seule chose à dire: merci bcp bcp bcp!
C'est très clair et très complet, je n'en demandais pas tant!
Bonne continuation à vous, et encore merci!
Christophe.
0
Hello !

Attention. La première allocation est incorrecte. Il faut écrire :

/* allocation mémoire pour le tableau de sous-tableaux :   */
    float** m = (float**) malloc(n * sizeof(float*));


Take care !
0
Steve Bouchard
18 mai 2007 à 15:13
L'exemple pour une matrice carrée, mathématiquement parlant, est excellent, mais concernant une matrice de NxM, là y a des subtilités supplémentaires que je ne pige pas!

Voici mon code inspiré d'un autre prit sur ce forum :

int main(void)//Dans ce contexte, on a 2 lignes et 3 colonnes
{
unsigned int n=2, i, j, k=3;
float** m = (float**) malloc(k * sizeof(float*));

/* allocation memoire pour chaque tableau de reels : */
for (i = 0; i < n; i++)
m[i] = (float*) malloc(n * sizeof(float));

/* affichage de chaque reel : */
for (i = 0; i < n; i++)
{ for (j = 0; j < k; j++)
{
m[i][j] = (i*10)+(j);
printf("M[%d][%d] = %.0f\n", i, j, m[i][j]);
}
}
/* désallocation mémoire de chaque sous-tableau de reels : */
for (i = 0; i < n; i++)
free(m[i]);
/* désallocation mémoire du tableau de sous-tableaux : */
free(m);

getchar();
return 0;
}

Donc, pour malloc, un sous-tableau c'est comme une colonne de '1' dans l'exemple ci-bas?
1234
1097
1876


Alors, en bas, il est question de son attribution de mémoire, vrai?
unsigned int n=4, i, j, k=3;
float** m = (float**) malloc(k * sizeof(float*));
********************
ET
for (i = 0; i < n; i++)
m[i] = (float*) malloc(n * sizeof(float));
Vaut pour chaque élément du vecteur 0, soit au élément correspodant, pour fin visuel, 1234.
***************
En somme, ma question est...
Puisque "float** m = (float**) malloc(k * sizeof(float*));"
Est-ce bien un allocation de mem pour un vecteur de grandeur 4?

Quelqu'un a une idée?
0
Merci vos commentaires m'ont beaucoup aidé
0
Hello !

Attention à bien allouer de la mémoire pour chaque sous-tableau.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned int n = 4, i, j;
    float** m = (float**) malloc(n * n * sizeof(float));
    
        /* allocation memoire pour chaque tableau de reels :    */
	for (i = 0; i < n; i++)
	    m[i] = (float*) malloc(n * sizeof(float));

	/* affichage de chaque reel :                           */
	for (i = 0; i < n; i++)
	    for (j = 0; j < n; j++)
	       printf("M[%d][%d] = %f\n", i, j, m[i][j]);
	
	return 0;
}


Take care !
0
Bug ! (allocations inutiles)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned int n = 4, i, j;
    float** m = (float**) malloc(n * sizeof(float));
    
    /* allocation memoire pour chaque tableau de reels :    */
	for (i = 0; i < n; i++)
	    m[i] = (float*) malloc(n * sizeof(float));

	/* affichage de chaque reel :                           */
	for (i = 0; i < n; i++)
	    for (j = 0; j < n; j++)
	       printf("M[%d][%d] = %f\n", i, j, m[i][j]);
	
	return 0;
}


C'est mieux (pas de gaspillage !) ];
0
salut ,
tp de méthode de simplexeavec le langage java .


merci.
0