Bonsoir à tous,
J'apprends petit à petit, mais je me suis rendu compte que j'avais un problème avec les chaines de caractères et la mémoire alloué avec les malloc / calloc etc.. (je ne connais pas le nom français). Bref j'ai voulu me faire un petit exercice "simple" pour manipuler cela. Mon but : jouer avec ce qui me gène, les pointeurs de pointeurs, la mémoire allouée et non contrainte et les chaines de caractère cela donne ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <duma.h>
 
char **inclure ( char **storage, long length, char *newitem )
{
	char **resul;
	if ( ! ( resul=realloc ( ( *storage ), ( length+1 ) *sizeof ( char* ) ) ) ) //je reserve un espace mémoire d'une case en plus
	{
		printf ( "Erreur lors de l'allocation mémoire\n" );
		exit ( -1 );
	}
	else
	{
		resul[length]=newitem;//je place l'élément à rajouter dans l'espace mémoire à la fin
		return resul;
	}
}
 
char **supprime ( char **storage, long length, long *num )
{
char **resul;
long n;
 
if ( ! ( resul=realloc ( ( *storage ), ( length-1 ) *sizeof ( char* ) ) ) ) //je reserve un espace mémoire d'une case en moins
	{
		printf ( "Erreur lors de l'allocation mémoire\n" );
		exit ( -1 );
	}
for(n=(*num);n<length-1;n++)
resul[n]=storage[n+1];
 
return resul;
}
 
void lecture ( char **storage, long length )
{
long n;
for(n=0;n<length;n++)// je me place dans chaque case de mon tableau et je lis le mot associé
printf("%s ",(*storage)[n]);
}
 
int main ( int argc, char *argv[] )
{
printf("1");//pour tester si cela bloque avant
char **storage=0;
long length=2;
printf("1");
long *index; *index=2;
char *string1="hello";
char *string2="world";
 
printf("1");
storage=inclure(storage, length, string1);
printf("2");
storage=inclure(storage, (length+1),string2);
lecture(storage, 2);
storage=supprime(storage, length, index);
 
free(*storage);
 
	return EXIT_SUCCESS;
}
Il se compile sans soucis (kdevelop) mais lors de son exécution, j'ai un toout bête "Erreur de segmentation" sauf que la première ligne de mon main n'est même pas exécuté, je ne comprends pas. Je suppose que j'ai fait de très nombreuses fautes dans mon code, si quelque chose vous choque ou vous intrigue merci de me le dire.

ps : je ne suis pas sûre d'avoir bien compris le realloc, pour moi cela prend la mémoire qui avait été allouée ici en l'occurrence à "storage" et cela la réalloue pour résul, donc simplement an "coupant" la dernière case, est-ce bien ça ? storage est-elle toujours accessible pour autant ? comme je l'utilise par la suite.. ou bien faut-il que je fasse une case tampon ?

merci encore