Allocation matrice de char uniquement avec malloc
Résolu
glupidon
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,
le sujet a était aborder au moins des centaine de fois et pourtant sa fonctionne toujours pas pour moi ...
j'aimerais savoir comment allouer dynamiquement un matrice (tableau 2 D) de char !
uniquement avec malloc !
voici un bout de code pour vous illustrer mon problème ( n'hésitez pas a me dire si certaine chose vous pique les yeux !
et voici le genre d'erreur que cela me génère
merci de votre future aide en espérant avoir des réponses assez rapide si possible !
EDIT: Précision du langage dans la coloration syntaxique.
le sujet a était aborder au moins des centaine de fois et pourtant sa fonctionne toujours pas pour moi ...
j'aimerais savoir comment allouer dynamiquement un matrice (tableau 2 D) de char !
uniquement avec malloc !
voici un bout de code pour vous illustrer mon problème ( n'hésitez pas a me dire si certaine chose vous pique les yeux !
int maloc_map(int fd, int cle)
{
int i;
char **map;
char *map2;
**map = (char **)malloc(sizeof(char*) * 11);
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
i = 0;
while (i < 11)
{
i++;
map[i] = &map2[i * 42];
}
make_map(map, cle, fd);
return (0);
}
int make_map(char **map, int cle, int fd)
{
int l;
int c;
char *str;
l = 0;
if ((str = malloc(sizeof(str))) == NULL)
{
my_putstr("error whith first malloc");
return (0);
}
while (l < 11)
{
c= 0;
if ((str = get_next_line(fd)) == NULL)
{
my_putstr("error whith str \n");
return (0);
}
while (c < 42)
{
map[l][c] = str[c];
c++;
}
l++;
}
brain(map, 0, 0, cle);
return (0);
}
et voici le genre d'erreur que cela me génère
make_game.c: In function `maloc_map':
make_game.c:23:9: warning: assignment makes integer from pointer without a cast [enabled by default]
**map = (char **)malloc(sizeof(char*) * 11);
^
make_game.c:24:9: warning: assignment makes integer from pointer without a cast [enabled by default]
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
^
make_game.c:23:4: warning: `map' is used uninitialized in this function [-Wuninitialized]
**map = (char **)malloc(sizeof(char*) * 11);
^
make_game.c:24:9: warning: `map2' is used uninitialized in this function [-Wuninitialized]
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
^
merci de votre future aide en espérant avoir des réponses assez rapide si possible !
EDIT: Précision du langage dans la coloration syntaxique.
A voir également:
- Malloc char**
- Coco char - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Convertir char en int c ✓ - Forum C
- Char(10) excel francais ✓ - Forum Excel
- Malloc - Forum Programmation
7 réponses
Bonjour
je n'ai pas lu en totalité ton code source précédent à savoir la création d'une matrice de caractère N*N car tu t'es écarté de ton objectif à la ligne 8. Je ne sais pas ce que tu as voulu à faire, mais voici un exemple d'allocation mémoire d'une matrice N*N (sans le contrôle d'allocation correcte ), son remplissage par le caractère A et la dé-allocation mémoire de celle-ci.
à bientôt
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
je n'ai pas lu en totalité ton code source précédent à savoir la création d'une matrice de caractère N*N car tu t'es écarté de ton objectif à la ligne 8. Je ne sais pas ce que tu as voulu à faire, mais voici un exemple d'allocation mémoire d'une matrice N*N (sans le contrôle d'allocation correcte ), son remplissage par le caractère A et la dé-allocation mémoire de celle-ci.
à bientôt
#include <stdio.h>
#include <stdlib.h>
#define _BUFF_ 5
int main( void ){
unsigned int i = 0;
unsigned int j = 0;
/* Allocation de la matrice */
char **p_str = (char**)malloc( _BUFF_ * sizeof(char*) );
for( i = 0; i< _BUFF_; i++ ){
p_str[i] = (char*)malloc( _BUFF_ * sizeof(char) );
}
/* Remplissage de la matrice */
for( i = 0; i <_BUFF_; i++){
for( j = 0; j <_BUFF_; j++ ){
p_str[i][j] = (char)( (33+i)+j );
}
}
/* Affichage de la matrice */
for( i = 0; i < _BUFF_; i++ ){
printf("%3d|\t ", i );
for( j = 0; j < _BUFF_; j++ ){
printf("%c\t", p_str[i][j] );
}
printf("\n");
}
/* Free memoire */
for( i = 0; i < _BUFF_; i++ ){
free( p_str[i] );
p_str[i] = NULL;
}
free( p_str );
p_str = NULL;
return( EXIT_SUCCESS );
}
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
Bonjour,
**map = (char **)malloc(sizeof(char*) * 11);
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
map n'est pas initialisé, tu ne peux donc pas pointer vers une valeur.
Il faut plutôt faire : map=malloc(sizeof(char*) * 11);
Note : le cast est superflu, voire même déconseillé.
De même : map2=malloc(42*11);
Note : j'ai retiré sizeof(char) car il vaut systématiquement 1. Mais tu peux le laisser sans souci.
while (i < 11)
{
i++;
map[i] = &map2[i * 42];
}
Dommage, tu fais i++; juste avant map[i]. Du coup, map[0] n'est pas initialisé. Il suffit de le mettre après.
map[i] est un char. Donc tu peux pas mettre un char** dedans. Que souhaites-tu faire ici ?
Cdlt,
**map = (char **)malloc(sizeof(char*) * 11);
*map2 = (char *)malloc(sizeof(char) * 42 * 11);
map n'est pas initialisé, tu ne peux donc pas pointer vers une valeur.
Il faut plutôt faire : map=malloc(sizeof(char*) * 11);
Note : le cast est superflu, voire même déconseillé.
De même : map2=malloc(42*11);
Note : j'ai retiré sizeof(char) car il vaut systématiquement 1. Mais tu peux le laisser sans souci.
while (i < 11)
{
i++;
map[i] = &map2[i * 42];
}
Dommage, tu fais i++; juste avant map[i]. Du coup, map[0] n'est pas initialisé. Il suffit de le mettre après.
map[i] est un char. Donc tu peux pas mettre un char** dedans. Que souhaites-tu faire ici ?
Cdlt,
ça ne doit même pas exister.Si, si, ça existe en C#, mais ça requiert de créer du code unsafe, et ça peut être "dangereux".
ha oui d'accord XD
je voie ou est le problème ....
il s'agit bien de C dans ce cas .
je viens de comprendre que C et C# sont deux langage bien différent ...
pour moi le c# n'était qu'une appellation pour langage c
je te remercie de ton intervention
je dormirais moins con ce soir XD
du coup je fait comment pour bouger mon sujet de catégorie ?
je voie ou est le problème ....
il s'agit bien de C dans ce cas .
je viens de comprendre que C et C# sont deux langage bien différent ...
pour moi le c# n'était qu'une appellation pour langage c
je te remercie de ton intervention
je dormirais moins con ce soir XD
du coup je fait comment pour bouger mon sujet de catégorie ?
J'ai déplacé ton sujet, il faut être Contributeur ou Modérateur pour pouvoir le faire et recorrigé la coloration.
Par j'ai quand même cherché, les pointeurs existent en C#, mais uniquement dans des cas particuliers https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/unsafe-code-pointers/
Par j'ai quand même cherché, les pointeurs existent en C#, mais uniquement dans des cas particuliers https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/unsafe-code-pointers/
Bonjour ,
merci a tous pour vos réponses !
je vais enfin pouvoir continué a avancer !
fiddy ,
je cherche a stocker dans chaque ligne de ma matrice
une chaine de caractère qui changera durant le programme (a chaque ligne )
cette chaine de caractère contiens uniquement des espace et des "|" d'où les char !
je me demande si avec une tel matrice c'est envisageable ou non ?
merci a tous pour vos réponses !
je vais enfin pouvoir continué a avancer !
fiddy ,
je cherche a stocker dans chaque ligne de ma matrice
une chaine de caractère qui changera durant le programme (a chaque ligne )
cette chaine de caractère contiens uniquement des espace et des "|" d'où les char !
je me demande si avec une tel matrice c'est envisageable ou non ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour
Dans mon ancien poste ligne 17 à 22 à ton avis qu'est ce que c'est ? aprés c'est à toi de l'adapté
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
Dans mon ancien poste ligne 17 à 22 à ton avis qu'est ce que c'est ? aprés c'est à toi de l'adapté
/* Remplissage de la matrice */
for( i = 0; i <_BUFF_; i++){
for( j = 0; j <_BUFF_; j++ ){
p_str[i][j] = (char)( (33+i)+j );
}
}
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw