Bonjour,

1) La compilation se passe bien. Mais, l'exécution ne se termine pas correctement et il y apparaition d'une fenêtre qui affiche:
<couleur nom="rouge">Debug assertion Failed!
Program :
File :f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Expression : _CrtIsValidHeapPointer(pUserData)
Line : 1317
</couleur>
Que signifie ce message ?

2)
Est ce que realloc()peut conduire dans certains cas à une fuite mémoire.
Quand on utilise malloc() et realloc() ?

Quels sont les tests à ajouter au programme pour assurer que nous avons bien alloués de la mémoire, que nous avons bien libérer les espaces mémoires utilisées, que les fichiers utilisés sont bien ouverts et fermants, que les chaines e caractères passées comme paramètres sont valides etc... ?

3)

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 
char * mstrndup(const char *str, size_t n)
{
    char *ret = malloc((n+1) * sizeof(char));
if (ret == NULL)
perror("erreur d'allocation\n");
    if(!ret)
        exit(0xDEAD);
 
    strncpy(ret, str, n);
    ret[n] = 0;
    return ret;
}
 
void display_tab(char** tab)
{
  while (tab && *tab)
  {
 
   printf("%s\n", *tab);
 
   tab++;
 
  } 
}
 
void free_table(char** t)
 
{
 
  char** head = t;
 
 
 
  while (t && *t)
 
  {
 
    free(*t);
 
    t++;
 
 
 
  }
 
  free(head);
 
}
 
 
 
char** copy_tab(char** tab)
 
{
 
  char** res = NULL;
 
  int nb = 0;
 
 
 
  while (tab && *tab)
 
  {
 
    nb++;
 
    res = realloc(res, (nb + 1) * sizeof (char*));
	if (res == NULL)
perror("erreur d'allocation\n");
 
    res[nb - 1] = mstrndup(*tab, strlen(*tab));
 
    res[nb] = 0;
 
    tab++;
 
  }
 
 
 
  return res;
 
}
 
void free_tab(char **t, size_t len)
{
    if(t)
    {
        size_t i;
        for(i = 0; i < len; i++)
            free(t[i]);
        free(t);
    }
}
J'ai pris quelques fonctions de mon programme:

- char * mstrndup(const char *str, size_t n)
- void display_tab(char** tab)
- char** copy_tab(char** tab)
- void free_table(char** t)
- void free_tab(char **t, size_t len)

avec:
t: c'est un pointeur sur le tableau(tableau de chaine de carctères).
*t: c'est la case en cours du tableau
**t: c'est la valeur

Je voulais vérifier avec vous si les fonctions décrites au dessus sont bien faites. Est ce que il y a des tests à ajouter et à vérifier concernant l'allocation, la taille de chaines, les paramètres des fonctions, etc...?

Merci.