Erreur de segmentation (core dumped)

Fermé
srakawa Messages postés 1 Date d'inscription mercredi 5 mars 2014 Statut Membre Dernière intervention 5 mars 2014 - 5 mars 2014 à 14:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 mars 2014 à 23:25
Avec ce code qui compile bien, je sais bien qu'il s'agit d'un pb de mémoire
La plus longue variable fera moins de 80 caractères.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MAX 10000
char *str_sub (const char *s, unsigned int start, unsigned int end)
{
char *new_s = NULL;

if (s != NULL && start < end)
{
/* (1)*/
new_s = malloc (sizeof (*new_s) * (end - start + 2));
if (new_s != NULL)
{
int i;

/* (2) */
for (i = start; i <= end; i++)
{
/* (3) */
new_s[i-start] = s[i];
}
new_s[i-start] = '\0';
}
else
{
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
}
return new_s;
}

int main(void)
{
FILE* fichier = NULL;
char *prov = malloc (sizeof (*prov) * 256);
char chaine[TAILLE_MAX] = "";
char *extrait = malloc (sizeof (*extrait) * 256);
char *httpd_root = malloc (sizeof (*httpd_root) * 256);
char *conf = malloc (sizeof (*conf) * 256);
char *chemin_conf = malloc (sizeof (*chemin_conf) * 256);
char *commande = malloc (sizeof (*commande) * 1024);
commande = "grep 'DocumentRoot' ";
//char* prov;
int taille;
system ("clear");
printf ("======================================================================\n");
printf ("| |\n");
printf ("| Recherche de la racine des documents de votre serveur WEB |\n");
printf ("| |\n");
printf ("| |\n");
printf ("| (c) 2014 Michel Billard |\n");
printf ("| |\n");
printf ("======================================================================\n\n\n\n\n\n");
system ("grep 'DocumentRoot' /etc/httpd/conf/httpd.conf > fic1.cor");
system ("clear");

system ("httpd -V > fic.cor");
system ("clear");
printf ("======================================================================\n");
printf ("| |\n");
printf ("| Recherche de la racine des documents de votre serveur WEB |\n");
printf ("| |\n");
printf ("| |\n");
printf ("| (c) 2014 Michel Billard |\n");
printf ("| |\n");
printf ("======================================================================\n\n\n\n\n\n");
fichier = fopen ("fic.cor", "r");
if (fichier == NULL)
{
printf("Impossible d'ouvrir le fichier fic.txt");
return -1;
}
else
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
extrait = strstr (chaine, "HTTPD_ROOT");
if (extrait != NULL)
{
prov = strstr(extrait, "/");
taille= strlen(prov);
strncpy (httpd_root, prov, taille-2);
}
extrait = strstr (chaine, " SERVER_CONFIG_FILE");
if (extrait != NULL)
{
prov = strstr(extrait, "\"");
taille= strlen(prov);
conf = str_sub(prov, 1, taille -3);// (conf, prov, taille-2);
chemin_conf = strcat(httpd_root, "/");
chemin_conf = strcat(chemin_conf, conf);
printf ("%s: %s\n\n", "Voici le chemin de httpd.conf", chemin_conf);
}

}
fclose (fichier);
//fonctionne parfaitement si je commente la ligne ci-dessous
commande = strcat(commande, chemin_conf);
printf("La commande à taper est %s%s\n\n", commande, chemin_conf);
}
return 0;
}
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 mars 2014 à 23:25
Bonjour,

Pourquoi enlever le "Bonjour" placé automatiquement ???
Merci de faire usage de plus de politesse.
De plus, votre code est illisible (il faut utiliser les balises "code c" prévues à cet effet).
Du coup, je n'ai pas tout lu.

Mais déjà :
new_s = malloc (sizeof (*new_s) * (end - start + 2));
for (i = start; i <= end; i++)

i doit aller de 0 à end-start+2 (non compris).

char *commande = malloc (sizeof (*commande) * 1024);
commande = "grep 'DocumentRoot' ";
Fuite de mémoire... Soit tu fais char *commande="grep 'DocumentRoot' "; soit tu fais char*commande=malloc(...); puis strcpy(commande,"grep 'DocumpentRoot' ");

Pour info, les commandes system() sont à éviter... Sinon, autant faire du shell...
0