Les Allergies
Alimentaires
Posez votre question Signaler

Malloc d'un tableau double entree

Chris - Dernière réponse le 15 déc. 2007 à 08:55
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.
Lire la suite 

Malloc d'un tableau double entree »

7 réponses
Réponse
+7
moins plus
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;
}
Chris - 19 sept. 2004 à 09:05
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.
Jolkdarr - 19 sept. 2004 à 10:50
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 !
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?
Ajouter un commentaire
Réponse
+0
moins plus
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 !
Ajouter un commentaire
Réponse
+0
moins plus
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 !) ];
Ajouter un commentaire
Réponse
+0
moins plus
salut ,
tp de méthode de simplexeavec le langage java .


merci.
Ajouter un commentaire
Ce document intitulé « Malloc d'un tableau double entree » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?