Allocation de la memoire

Fermé
adibou666 - 4 nov. 2006 à 21:36
 Fab - 5 nov. 2006 à 11:34
Bonjour voila mon programme, seulement j'ai un probleme que je n'arrive pas a resoudre je souhaiterais pouvoir faire en sorte de rentrer
une chaine de caractere pour le pointeur element donc de longeur variable ,(ici je l'ai fixer) je suppose kil faut que je le remplisse de la facon suivante : scanf("%s",&*element);

pour pouvoir ensuite l'inserer dans mon tableau (**tab)
seulement j'ai un gros prob au nivo de l'allocation de la memoire je ne sais pas comment la modifier pour pouvoir allouer une chaine de caractere de longueur variable correspondant a ce que je rentrerai dans *element

voici mon prog

merci de pouvoir m'aider
cordialement




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

main()
{
int i,j;
char **tab;
char *element="11";
int taille = 4;


tab = (char**) malloc(taille * sizeof(char *));

for(i=0;i<taille;i++)
{

*(tab+i) = element;
}

for(i=0;i<taille;i++)
{
printf("%s\n",*(tab+i));
}


for(i=0;i<taille;i++){
printf("Ligne %d:\n",i+1);
for(j=0;j<3;j++){
printf("%c \n",tab[i][j]);
}
}

fflush(stdin);
getchar();
}
A voir également:

2 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 nov. 2006 à 21:55
Ha, c'est le problème avec scanf, tu ne sais pas à l'avance la longueur de la chaîne qu'on va rentrer avec ça.
Vaut mieux utiliser une boucle avec getchar() en limitant le nombre de caractères à saisir. Mettons dix par exemple. Ca donnera:
char *element=malloc(10);
int i;
for (i=0;i<10;i++){
	if( (element[i]=(char)getchar()) == '\n'){
		break;
	}
}
element[i]='\0';
printf("%s\n",element);
return 0;

Si tu veux pouvoir saisir des chaines de longueur variable que pourrait entrer l'utilisateur, il faudra passer par des fonctions comme realloc par exemple....
0
Bonjour,

Si j'ai bien compris tu souhaites créer un tableau de chaines de caractères qui ont chacune leur longueur propre.

Tu peux allouer à chacune d'elles une taille différente en divisant le travail en deux étapes :

1) tu fixes une limite élevée au nombre de caractères que l'utilisateur peut entrer (par exemple, 1000)

2) tu réserve en mémoire l'espace minimum nécessaire pour stocker la chaîne saisie. il suffit de récupérer la taille de la chaîne (strlen) et de faire une nouvelle allocation mémoire (malloc).

Ce qui donne :

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

int main()
{
	char **tab;
	char *chaine1,*chaine2;
	int i,x,total=0;
	int taille = 3;

	tab = (char**) malloc(taille * sizeof(char *));

	for(i=0; i<taille; i++)
	{
		printf("\nLigne %d = ",i);
		chaine1 = (char*)malloc(sizeof(char)*1000);
		gets(chaine1);
		x = strlen(chaine1);
		chaine2 = (char*)malloc(sizeof(char)*x);
		free(chaine1);
		tab[i] = chaine2;
		total += x;
	}

	for(i=0; i<taille; i++)
	{
		printf("%s\n",tab[i]);
	}
	printf("La taille du tableau est de %d octets.\n",total*sizeof(char));
	
	for (i=0; i<taille; i++) free(tab[i]);
	free(tab);
	
	return 0;
}


Fab
0