Rechercher : dans
Par :

Pointeur de pointeurs en C

Dernière réponse le 9 nov 2007 à 07:38:59 tafiscobar, le 8 fév 2003 à 14:16:21 
 Signaler ce message aux modérateurs

Bonjour, j'espere q quelqu'un pourra m'aider, je n comprend pas pourqoi j'ai toujours Segmentation fault a l'execution,voici le code,il est simple, j'omets ici les includes
int main(int argc, char* argv[]) {
int i=0; char **str;
str=malloc(30*3*sizeof(char));
//initialisations manuelle
for(;i<3;i++)
strcpy(str[i],argv[i]); //ici erreur d'execution.
//essai d'affichage
for(i=0;i<3;i++)
printf("%s",str[i]);

return 1;
}

//j'espere q quelqu'un pourra m'aider,et please pas de vecteurs de pointeurs, mon bleme c'est d'utiliser les pointeurs de pointeurs.
tafiscobar

Meilleures réponses pour « pointeur de pointeurs en C » dans :
[Windows XP] Points de restauration Voir1 - Points de restauration et données personnelles 2 - Vérifier le service 3 - Paramétrer les partitions à restaurer 4 - Remarque 5 - Taille de la sauvegarde et nettoyage 6 - Créer un point de restauration 7 - Restaurer un point de...
Les pointeurs en langage C VoirDéfinition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
Les protocoles PPP et SLIP VoirLa plupart des personnes, n'ayant pas chez elles de ligne (câble ou ethernet) reliée directement à Internet, sont obligées d'utiliser les lignes téléphoniques (le réseau le plus répandu) pour se connecter à Internet. La connexion se fait grâce à un...

1

marvinrouge, le 8 fév 2003 à 16:10:25
  • +1

Voici ton code corrigé

int main(int argc, char* argv[]) {
int i=0;
char **str;
str=(char**)malloc(30*3*sizeof(char*)); // il vaut mieux 'caster' en char**, le type de str, car malloc rend un void*
// et c'était sizeof(char*) puisque str est de tpye char**, pour le sizeof tu recopies le type avec une '*' en moins.

//initialisations manuelle
for(;i<3;i++)
{
// ATTENTION str est bien alloué ci-dessus mais tu oubliai que tu DOIS allouer CHACUN des str[i]
str[i] = (char*)malloc((strlen(argv[i])+1)*sizeof(char);
strcpy(str[i],argv[i]); //normalement l'erreur est corrigée
//essai d'affichage
}
for(i=0;i<3;i++)
printf("%s",str[i]);
return 1;
}

Répondre à marvinrouge

2

marvinrouge, le 8 fév 2003 à 16:20:11

Encore moi,

j'ai juste oublié de préciser qu'il faut libérer la mémoire AVANT la fin du programme
les str[i] d'abord, str ensuite

for(i=0;i<3;i++)
{
free(str[i]);
str[i] = NULL;
}

free(str);
str = NULL;

Répondre à marvinrouge

3

tafiscobar, le 9 fév 2003 à 17:57:33

Merci marvinrouge.
au fait, lorsq je faisais ceci: str=malloc(30*3*sizeof(char));,je pensais que c'etait possible de lui demander d'allouer directement un tableau(taille=3) de pointeurs sur char (de taille 30),mais bon cela m'apprendra a essayer de trouver plus simple que le simple.
tafiscobar

Répondre à tafiscobar

4

marvinrouge, le 10 fév 2003 à 08:37:38

En fait tu peux allouer soit des tableaux de tableaux (char**, ce qui ressemble à un 'peigne' dans el monde réel)c'est le plus clazssqiue et les redimensionnements dynamiques sont pas tout simples MAIS sont rapides à l'éxécution

soit un long tableau contigu (char*) ou tu mettras toutes tes chaines à la suite les unes des autres mais c'est très dangereux à gérer (dépassement de mémoire, oubli du '\0')
de plus c'est dur à redimmensionner dynamiquemeent

Répondre à marvinrouge

5

habibsiby, le 9 nov 2007 à 02:38:24

Bonjour,
si vous pouvez m'aidez sur les pointeurs je les saisie pas bien
par exemple si on dit
int fontion(int*)
je cmprends pas cette indice *

Répondre à habibsiby

6

 lami20j, le 9 nov 2007 à 07:38:59

Salut,

ça veut dire que la fonction prendre en argument un pointeur sur un entier
on pouvait écrire

int fonction(int *nombre)
pour être plus explicite
lami20j

Répondre à lami20j