Il existe donc une fonction qui alloue une nouvelle mémoire de pointeur et lorsque j'essaie de délocaliser l'ancien que le programme se bloque essentiellement Mon code
char** AddingToTheBook(char** original, int* size, char *number)
{
char** newArray = (char**)malloc(sizeof(char*)*(*size));
//allocating and copying the values
for (int i = 0; i < *size; i++)
{
*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))));
strcpy(*(newArray + i), *(original + i));
}
//allocating a new memory to the new number
*(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
strcpy(*(newArray + (*size)), number);
(*size)++;
//delocating the allocated memories
for (int i = 0; i < size; i++)
free(original[i]);
free(original);
return newArray;
}
3 Réponses :
SHLEN code> ne renvoie que le nombre de caractères. Faire de la place pour la fin zéro
* (Newarray + i) = (Char *) Malloc (Tailleof (Char) * (Strlen (* (Original + I))) +1);
code> li>
-
meilleur à strncpy code> au lieu de Strcpy code> p> li>
-
Comment pouvez-vous aller * Taille code> à l'avance dans Newarray code>:
* (Newarray + (* Taille)) = (Char *) Malloc (Tailleof (Char) * SHLEN (NUMBER));
code>
Vous ne pouvez aller que * Taille -1 code> à l'avance, car il commence à partir de zéro. P> li>
-
dans le pour code> boucle, il semble que vous avez oublié d'ajouter l'astérisque * code>
pour (int i = 0; i p> li>
ol>
Remplaçant aveuglément strcpy () code> avec strncpy () code> est dangereux. STRNCPY () CODE> Ne garantit pas que la chaîne copiée est terminée avec un caractère NUL.
Point 2. Strncpy est plus dangereux, mais dans ce cas, il est le meilleur. Vous avez alloué assez d'espace
Vous libérez trop de votre mémoire d'origine.
Regardez la boucle pour la boucle lorsque vous libérez la mémoire: P>
(*size)++;
//delocating the allocated memories
for (int i = 0; i < *size - 1; i++)
free(original[i]);
Vous pouvez utiliser REALLOC à la place
char **tmp = AddingToTheBook(book, size, "Test String")
if(tmp)
{
book = tmp;
size++;
}
else
{
/* do something adding to book failed */
}
Cela a-t-il une fuite de mémoire si realloc code> échoue?
Non, cela renvoie NULL, alors que le pointeur d'origine transmis aux fonctions est conservé. Pas de danger si correctement utilisé
poster comme un texte pas l'image
Veuillez poster un exemple de reproductible minimal . Avez-vous parcouru le code dans un débogueur? C'est la première chose à faire
Et vous n'avez pas besoin ni ne doit pas lancer
malloc code> en CCompilez avec des avertissements, l'un d'eux vous dira de la comparaison entre Integer et Pointeur - c'est le bogue.